Package spade :: Module AMS
[hide private]
[frames] | no frames]

Source Code for Module spade.AMS

  1  # encoding: UTF-8 
  2   
  3  from Agent import PlatformAgent 
  4  import AID 
  5  import Behaviour 
  6  from SL0Parser import * 
  7  import copy 
  8   
  9  import xmpp 
 10   
 11  from spade.msgtypes import * 
 12  from content import ContentObject 
 13   
14 -class AMS(PlatformAgent):
15 """ 16 Agent Management System 17 """ 18
19 - class DefaultBehaviour(Behaviour.Behaviour):
20 - def __init__(self):
21 Behaviour.Behaviour.__init__(self) 22 self.sl0parser = SL0Parser()
23
24 - def onStart(self):
26 27 # t = Behaviour.PresenceTemplate(type="subscribed") 28 # self.registerPresenceHandler(t, self.subscribedCB) 29 # t = Behaviour.PresenceTemplate(type="unsubscribed") 30 # tt = Behaviour.PresenceTemplate(type="unavailable") 31 # self.registerPresenceHandler(t, self.unsubscribedCB) 32 # self.registerPresenceHandler(tt, self.unsubscribedCB) 33 # t = Behaviour.PresenceTemplate(type="subscribe") 34 # self.registerPresenceHandler(t, self.subscribeCB) 35
36 - class SubscribeBehaviour(Behaviour.Behaviour):
37 - def _process(self):
38 msg = None 39 msg = self._receive(block=True) 40 if msg: 41 self.myAgent.DEBUG("AMS received presence message "+ str(msg),"info") 42 typ = msg.getType() 43 frm = msg.getFrom() 44 status = msg.getStatus() 45 show = msg.getShow() 46 reply_address = frm 47 if typ == "subscribe": 48 frm=AID.aid(name=str(frm), addresses=["xmpp://"+str(frm)]) 49 aad = AmsAgentDescription() 50 aad.name = frm 51 if status: aad.state = status 52 if show: aad.ownership = show 53 else: aad.ownership = frm.getName() 54 55 if not self.myAgent.agentdb.has_key(frm.getName()): 56 self.myAgent.agentdb[frm.getName()] = aad 57 elif self.myAgent.agentdb[frm.getName()].getOwnership() == aad.getOwnership(): 58 self.myAgent.agentdb[frm.getName()] = aad 59 else: 60 presence = xmpp.Presence(reply_address,typ="unsubscribed",xmlns=xmpp.NS_CLIENT) 61 presence.setFrom(self.myAgent.JID) 62 self.myAgent.send(presence) 63 return 64 65 self.myAgent.DEBUG("AMS succesfully registered agent " + frm.getName(),"ok") 66 presence = xmpp.Presence(reply_address,typ="subscribed") 67 presence.setFrom(self.myAgent.JID) 68 self.myAgent.DEBUG("AMS sends "+str(presence),"info") 69 self.myAgent.send(presence) 70 elif typ == "unsubscribe": 71 if self.myAgent.agentdb.has_key(str(frm)): 72 del self.myAgent.agentdb[str(frm)] 73 self.myAgent.DEBUG("Agent " + str(frm) + " deregistered from AMS","ok") 74 else: 75 self.myAgent.DEBUG("Agent " + str(frm) + " deregistered from AMS","error") 76 return
77 78
79 - def _process(self):
80 error = False 81 msg = self._receive(True) 82 if msg != None: 83 if msg.getPerformative().lower() == 'request': 84 if msg.getOntology() and msg.getOntology().lower() == "fipa-agent-management": 85 if msg.getLanguage().lower() == "fipa-sl0": 86 content = self.sl0parser.parse(msg.getContent()) 87 ACLtemplate = Behaviour.ACLTemplate() 88 ACLtemplate.setConversationId(msg.getConversationId()) 89 ACLtemplate.setSender(msg.getSender()) 90 template = (Behaviour.MessageTemplate(ACLtemplate)) 91 92 if "action" in content: 93 self.myAgent.DEBUG("AMS: "+str(content.action)+ " request. " + str(content),"info") 94 if "register" in content.action \ 95 or "deregister" in content.action: 96 self.myAgent.addBehaviour(AMS.RegisterBehaviour(msg,content), template) 97 elif "get-description" in content.action: 98 self.myAgent.addBehaviour(AMS.PlatformBehaviour(msg,content), template) 99 elif "search" in content.action: 100 self.myAgent.addBehaviour(AMS.SearchBehaviour(msg,content), template) 101 elif "modify" in content.action: 102 self.myAgent.addBehaviour(AMS.ModifyBehaviour(msg,content), template) 103 else: 104 reply = msg.createReply() 105 reply.setSender(self.myAgent.getAID()) 106 reply.setPerformative("refuse") 107 reply.setContent("( "+msg.getContent() +"(unsuported-function "+ content.keys()[0] +"))") 108 self.myAgent.send(reply) 109 110 return -1 111 112 elif msg.getLanguage().lower() == "rdf": 113 # Content in RDF 114 co = msg.getContentObject() 115 content = msg.getContent() 116 ACLtemplate = Behaviour.ACLTemplate() 117 ACLtemplate.setConversationId(msg.getConversationId()) 118 ACLtemplate.setSender(msg.getSender()) 119 template = (Behaviour.MessageTemplate(ACLtemplate)) 120 121 if co.has_key("fipa:action") and co["fipa:action"].has_key("fipa:act"): 122 self.myAgent.DEBUG("AMS: "+str(co["fipa:action"]["fipa:act"])+ " request. " + str(co.asRDFXML()),"info") 123 if co["fipa:action"]["fipa:act"] in ["register","deregister"]: 124 self.myAgent.addBehaviour(AMS.RegisterBehaviour(msg,content), template) 125 elif co["fipa:action"]["fipa:act"] == "get-description": 126 self.myAgent.addBehaviour(AMS.PlatformBehaviour(msg,content), template) 127 elif co["fipa:action"]["fipa:act"] == "search": 128 self.myAgent.addBehaviour(AMS.SearchBehaviour(msg,content), template) 129 elif co["fipa:action"]["fipa:act"] == "modify": 130 self.myAgent.addBehaviour(AMS.ModifyBehaviour(msg,content), template) 131 else: 132 reply = msg.createReply() 133 reply.setSender(self.myAgent.getAID()) 134 reply.setPerformative("refuse") 135 co["unsuported-function"] = "true" 136 reply.setContentObject(co) 137 self.myAgent.send(reply) 138 return -1 139 140 141 142 else: error = "(unsupported-language "+msg.getLanguage()+")" 143 else: error = "(unsupported-ontology "+msg.getOntology()+")" 144 145 146 # By adding 'not-understood' to the following list of unsupported acts, we prevent an 147 # infinite loop of counter-answers between the AMS and the registering agents 148 elif msg.getPerformative().lower() not in ['failure','refuse','not-understood']: 149 error = "(unsupported-act " + msg.getPerformative() + ")" 150 if error: 151 reply = msg.createReply() 152 reply.setSender(self.myAgent.getAID()) 153 reply.setPerformative("not-understood") 154 reply.setContent("( "+msg.getContent() + error+")") 155 self.myAgent.send(reply) 156 return -1 157 158 159 return 1
160
161 - class RegisterBehaviour(Behaviour.OneShotBehaviour):
162
163 - def __init__(self,msg,content):
164 Behaviour.OneShotBehaviour.__init__(self) 165 self.msg = msg 166 self.content = content
167
168 - def _process(self):
169 170 #The AMS agrees and then informs dummy of the successful execution of the action 171 error = False 172 173 try: 174 if "register" in self.content.action: 175 aad = AmsAgentDescription(self.content.action.register['ams-agent-description']) 176 else: 177 aad = AmsAgentDescription(self.content.action.deregister['ams-agent-description']) 178 except KeyError: #Exception,err: 179 error = "(missing-argument ams-agent-description)" 180 181 182 if error: 183 reply = self.msg.createReply() 184 reply.setSender(self.myAgent.getAID()) 185 reply.setPerformative("refuse") 186 reply.setContent("( "+self.msg.getContent() + error + ")") 187 self.myAgent.send(reply) 188 189 return -1 190 191 else: 192 reply = self.msg.createReply() 193 reply.setSender(self.myAgent.getAID()) 194 reply.setPerformative("agree") 195 reply.setContent("(" + str(self.msg.getContent()) + " true)") 196 self.myAgent.send(reply) 197 198 199 200 201 if "register" in self.content.action: 202 if not self.myAgent.agentdb.has_key(aad.getAID().getName()): 203 204 try: 205 self.myAgent.agentdb[aad.getAID().getName()] = aad 206 except Exception, err: 207 reply.setPerformative("failure") 208 reply.setContent("("+self.msg.getContent() + "(internal-error))") 209 self.myAgent.send(reply) 210 return -1 211 212 213 214 reply.setPerformative("inform") 215 reply.setContent("(done "+self.msg.getContent() + ")") 216 self.myAgent.send(reply) 217 218 return 1 219 220 else: 221 reply.setPerformative("failure") 222 reply.setContent("("+self.msg.getContent() + "(already-registered))") 223 self.myAgent.send(reply) 224 return -1 225 226 elif "deregister" in self.content.action: 227 228 if self.myAgent.agentdb.has_key(aad.getAID().getName()): 229 try: 230 del self.myAgent.agentdb[aad.getAID().getName()] 231 except Exception, err: 232 reply.setPerformative("failure") 233 reply.setContent("("+self.msg.getContent() + '(internal-error "could not deregister agent"))') 234 self.myAgent.send(reply) 235 return -1 236 237 238 239 reply.setPerformative("inform") 240 reply.setContent("(done "+self.msg.getContent() + ")") 241 self.myAgent.send(reply) 242 243 return 1 244 245 else: 246 reply.setPerformative("failure") 247 reply.setContent("("+self.msg.getContent() + "(not-registered))") 248 self.myAgent.send(reply) 249 return -1
250
251 - class PlatformBehaviour(Behaviour.OneShotBehaviour):
252
253 - def __init__(self,msg,content):
254 Behaviour.OneShotBehaviour.__init__(self) 255 self.msg = msg 256 self.content = content
257
258 - def _process(self):
259 # Create an AGREE reply 260 reply = self.msg.createReply() 261 reply.setSender(self.myAgent.getAID()) 262 reply.setPerformative("agree") 263 264 if "rdf" in self.msg.getLanguage().lower(): 265 # The content language is RDF 266 rdf = True 267 co = self.msg.getContentObject() 268 co["fipa:done"] = "true" 269 reply.setContentObject(co) 270 else: 271 rdf = False 272 reply.setContent("(" + str(self.msg.getContent()) + " true)") 273 274 # Send the AGREE reply 275 self.myAgent.send(reply) 276 277 # Set up the content of the actual reply 278 if rdf: 279 co_rep = ContentObject() 280 co_rep["ap-description"] = ContentObject() 281 co_rep["ap-description"]["name"] = "xmpp://"+self.myAgent.getSpadePlatformJID() 282 co_rep["ap-description"]["ap-services"] = [] 283 co_serv = ContentObject() 284 co_serv["ap-service"] = ContentObject() 285 co_serv["ap-service"]["name"] = "xmpp://" + str(self.myAgent.getAMS().getName()) 286 co_serv["ap-service"]["type"] = "fipa.agent-management.ams" 287 co_serv["ap-service"]["addresses"] = [] 288 co_serv["ap-service"]["addresses"].append(self.myAgent.getSpadePlatformJID()) 289 co_rep["ap-description"]["ap-services"].append(co_serv) 290 reply.setContentObject(co_rep) 291 else: 292 # Write the content in old ugly SL0 293 content = "(ap-description :name xmpp://"+self.myAgent.getSpadePlatformJID()+ " :ap-services (set " 294 295 #TODO acceso al nombre de la plataforma y los servicios ofertados (df, ams, etc...) 296 """ 297 for s in "TODO_SERVICES": 298 content += "(ap-service :name " + s.name 299 content += " :type " + s.type 300 content += " :addresses (sequence " 301 for ad in s.addresses: 302 content += ad + " " 303 content += "))" 304 """ 305 306 content += "(ap-service :name xmpp://"+ str(self.myAgent.getAMS().getName()) 307 content += " :type fipa.agent-management.ams " #TODO 308 content += " :addresses (sequence " + str(self.myAgent.getSpadePlatformJID()) + ")" 309 content + " ) )" 310 311 content += ")" 312 reply.setContent(content) 313 314 # Send the actual INFORM reply 315 reply.setPerformative("inform") 316 self.myAgent.send(reply) 317 318 return 1
319
320 - class SearchBehaviour(Behaviour.OneShotBehaviour):
321
322 - def __init__(self,msg,content):
323 Behaviour.OneShotBehaviour.__init__(self) 324 self.msg = msg 325 self.content = content
326
327 - def _process(self):
328 329 error = False 330 rdf = True 331 max = 1000 332 333 reply = self.msg.createReply() 334 reply.setSender(self.myAgent.getAID()) 335 reply.setPerformative("agree") 336 337 if "rdf" in self.msg.getLanguage().lower(): 338 rdf = True 339 co = self.msg.getContentObject() 340 co["fipa:done"] = "true" 341 reply.setContentObject(co) 342 343 else: 344 # Old ugly SL0 345 rdf = False 346 reply.setContent("(" + str(self.msg.getContent()) + " true)") 347 348 self.myAgent.send(reply) 349 350 if not rdf: 351 if "search-constraints" in self.content.action.search: 352 if "max-results" in self.content.action.search["search-constraints"]: 353 try: 354 max = int(self.content.action.search["search-constraints"]["max-results"]) 355 except Exception, err: 356 error = '(internal-error "max-results is not an integer")' 357 if error: 358 reply = self.msg.createReply() 359 reply.setSender(self.myAgent.getAID()) 360 reply.setPerformative("failure") 361 reply.setContent("( "+self.msg.getContent() + error+")") 362 self.myAgent.send(reply) 363 return -1 364 365 366 result = [] 367 if "ams-agent-description" in self.content.action.search: 368 aad = AmsAgentDescription(self.content.action.search['ams-agent-description']) 369 for a in self.myAgent.agentdb.values(): 370 if max >= 0: 371 if a.match(aad): 372 result.append(a) 373 max -= 1 374 else: break 375 376 else: 377 result = self.myAgent.agentdb.values() 378 379 content = "((result " #TODO: + self.msg.getContent() 380 if len(result)>0: 381 content += " (set " 382 for i in result: 383 content += str(i) + " " 384 content += ")" 385 else: 386 content+= 'None' 387 content += "))" 388 389 reply.setContent(content) 390 391 else: 392 # The RDF way of things, baby 393 # Delete done (from previous reply) 394 del co["fipa:done"] 395 # Look for search constraints 396 if co["fipa:action"].has_key("constraints"): 397 try: 398 max = int(co["fipa:action"]["constraints"]) 399 except: 400 error = 'constraints-error' 401 if error: 402 reply = self.msg.createReply() 403 reply.setSender(self.myAgent.getAID()) 404 reply.setPerformative("failure") 405 co["fipa:error"] = error 406 reply.setContentObject(co) 407 self.myAgent.send(reply) 408 return -1 409 410 # Search for the results 411 result = [] 412 if co["fipa:action"].has_key("fipa:argument") and co["fipa:action"]["fipa:argument"]: 413 aad = AmsAgentDescription(co=co["fipa:action"]["fipa:argument"]) 414 for a in self.myAgent.agentdb.values(): 415 if max >= 0: 416 if a.match(aad): 417 result.append(a) 418 max -= 1 419 else: break 420 else: 421 result = self.myAgent.agentdb.values() 422 423 co2 = ContentObject(namespaces={"http://www.fipa.org/schemas/fipa-rdf0#":"fipa:"}) 424 co2["fipa:result"] = [] 425 for i in result: 426 co2["fipa:result"].append(i.asContentObject()) 427 reply.setContentObject(co2) 428 429 430 reply.setPerformative("inform") 431 self.myAgent.send(reply) 432 433 return 1
434
435 - class ModifyBehaviour(Behaviour.OneShotBehaviour):
436
437 - def __init__(self,msg,content):
438 Behaviour.OneShotBehaviour.__init__(self) 439 self.msg = msg 440 self.content = content
441
442 - def _process(self):
443 #The AMS agrees and then informs dummy of the successful execution of the action 444 error = False 445 aad = None 446 447 if "rdf" in self.msg.getLanguage().lower(): 448 rdf = True 449 else: 450 # Old ugly SL0 451 rdf = False 452 453 if not rdf: 454 455 try: 456 aad = AmsAgentDescription(self.content.action.modify['ams-agent-description']) 457 except Exception,err: 458 error = "(missing-argument ams-agent-description)" 459 self.myAgent.DEBUG("Modify: Missing argument in ams-agent-description",'error') 460 #print "aad: " + str(aad.getAID().getName()) 461 #print "aid: " + str(self.msg.getSender()) 462 463 # If there is no AID in the AAD, fill it with the sender of the message 464 if aad.getAID() and aad.getAID().getName() == None: 465 aad.setAID(self.msg.getSender()) 466 self.myAgent.DEBUG("Modify: Overwriting missing AID with sender AID "+ str(self.msg.getSender()),'warn') 467 468 if aad and (not aad.getAID() == self.msg.getSender()): 469 error = "(unauthorised)" 470 self.myAgent.DEBUG("Modify: Unauthorised. AID does not match with sender",'error') 471 472 if error: 473 reply = self.msg.createReply() 474 reply.setSender(self.myAgent.getAID()) 475 reply.setPerformative("refuse") 476 reply.setContent("( "+self.msg.getContent() + error + ")") 477 self.myAgent.send(reply) 478 479 return -1 480 481 else: 482 reply = self.msg.createReply() 483 reply.setSender(self.myAgent.getAID()) 484 reply.setPerformative("agree") 485 reply.setContent("(" + str(self.msg.getContent()) + " true)") 486 self.myAgent.send(reply) 487 488 if self.myAgent.agentdb.has_key(aad.getAID().getName()): 489 490 try: 491 self.myAgent.agentdb[aad.getAID().getName()] = aad 492 except Exception, err: 493 reply.setPerformative("failure") 494 reply.setContent("("+self.msg.getContent() + "(internal-error))") 495 self.myAgent.send(reply) 496 return -1 497 498 reply.setPerformative("inform") 499 reply.setContent("(done "+self.msg.getContent() + ")") 500 self.myAgent.send(reply) 501 502 return 1 503 504 else: 505 reply.setPerformative("failure") 506 reply.setContent("("+self.msg.getContent() + "(not-registered))") 507 self.myAgent.send(reply) 508 #print aad.getAID().getName() 509 #print self.myAgent.agentdb 510 return -1 511 512 else: 513 #Language is RDF 514 co = self.msg.getContentObject() 515 if co["fipa:action"].has_key("fipa:argument") and co["fipa:action"]["fipa:argument"]: 516 aad = AmsAgentDescription(co=co["fipa:action"]["fipa:argument"]) 517 else: 518 error = "missing-argument ams-agent-description" 519 self.myAgent.DEBUG("Modify: Missing argument in ams-agent-description",'error') 520 #print "aad: " + str(aad.getAID().getName()) 521 #print "aid: " + str(self.msg.getSender()) 522 523 # If there is no AID in the AAD, fill it with the sender of the message 524 if aad.getAID() and aad.getAID().getName() == None: 525 self.myAgent.DEBUG("Modify: Overwriting missing AID with sender AID "+ str(self.msg.getSender()),'warn') 526 aad.setAID(self.msg.getSender()) 527 528 #An agent is only allowed to modify itself 529 if aad and (not aad.getAID() == self.msg.getSender()): 530 error = "unauthorised" 531 self.myAgent.DEBUG("Modify: Unauthorised. AID does not match with sender",'error') 532 533 534 535 if error: 536 reply = self.msg.createReply() 537 reply.setSender(self.myAgent.getAID()) 538 reply.setPerformative("refuse") 539 co["fipa:error"] = error 540 reply.setContentObject(co) 541 self.myAgent.send(reply) 542 543 return -1 544 545 else: 546 reply = self.msg.createReply() 547 reply.setSender(self.myAgent.getAID()) 548 reply.setPerformative("agree") 549 co["fipa:done"]="true" 550 reply.setContentObject(co) 551 self.myAgent.send(reply) 552 553 del co["fipa:done"] 554 555 if self.myAgent.agentdb.has_key(aad.getAID().getName()): 556 557 try: 558 self.myAgent.agentdb[aad.getAID().getName()] = aad 559 except Exception, err: 560 reply.setPerformative("failure") 561 co["fipa:error"] = "internal-error" 562 reply.setContentObject(co) 563 self.myAgent.send(reply) 564 return -1 565 566 reply.setPerformative("inform") 567 co["fipa:done"] = "true" 568 reply.setContentObject(co) 569 self.myAgent.send(reply) 570 571 return 1 572 573 else: 574 reply.setPerformative("failure") 575 co["fipa:error"]="not-registered" 576 reply.setContentObject(co) 577 self.myAgent.send(reply) 578 #print aad.getAID().getName() 579 #print self.myAgent.agentdb 580 return -1
581 582
583 - def __init__(self,node,passw,server="localhost",port=5347,config={}):
584 PlatformAgent.__init__(self,node,passw,server,port,config)
585 586
587 - def _setup(self):
588 589 self.agentdb = dict() 590 591 AAD = AmsAgentDescription() 592 AAD.name = self.getAID() 593 AAD.ownership = "SPADE" 594 AAD.state = "active" 595 596 self.agentdb[self.getAID().getName()] = AAD 597 598 if self.getDF(): 599 AAD = AmsAgentDescription() 600 AAD.name = self.getDF() 601 AAD.ownership = "SPADE" 602 AAD.state = "active" 603 self.agentdb[self.getDF().getName()] = AAD 604 605 db = self.DefaultBehaviour() 606 #db.setPeriod(0.25) 607 #self.setDefaultBehaviour(db) 608 mt = Behaviour.ACLTemplate() 609 mt.setOntology("FIPA-Agent-Management") 610 mt.setPerformative("request") 611 mt.setProtocol('fipa-request') 612 self.addBehaviour(db,Behaviour.MessageTemplate(mt)) 613 614 self.wui.start()
615
616 -class AmsAgentDescription:
617 """ 618 Agent Descriptor for AMS registering 619 """ 620
621 - def __init__(self, content = None, co = None):
622 """ 623 AAD constructor 624 Optionally accepts a string containing a SL definition of the AAD 625 or a ContentObject version of the AAD 626 """ 627 628 self.name = None #AID.aid() 629 self.ownership = None 630 self.state = "active" 631 632 if co: 633 try: 634 self.name = AID.aid(co=co["fipa:aid"]) 635 except: 636 self.name = None 637 try: 638 self.ownership = co["fipa:ownership"] 639 except: 640 self.ownership = None 641 try: 642 self.state = co["fipa:state"] 643 except: 644 self.state = None 645 elif content != None: 646 self.loadSL0(content)
647
648 - def setAID(self, a):
649 """ 650 sets the AID class 651 """ 652 self.name = copy.copy(a)
653
654 - def getAID(self):
655 """ 656 returns the AID class 657 """ 658 return self.name
659
660 - def setOwnership(self,owner):
661 """ 662 sets the ownership 663 """ 664 self.ownership = str(owner)
665
666 - def getOwnership(self):
667 """ 668 returns the ownership 669 """ 670 return self.ownership
671
672 - def setState(self,state):
673 """sets state""" 674 self.state = str(state)
675
676 - def getState(self):
677 """ 678 returns the state of the agent 679 """ 680 return self.state
681
682 - def match(self,y):
683 """ 684 returns True if y is part of the AAD 685 """ 686 if self.name != None and y.getAID() != None and (not self.name.match(y.getAID())): 687 return False 688 if self.ownership != None and y.getOwnership() != None and not (y.getOwnership().lower() in self.ownership.lower()): 689 return False 690 if self.state != None and y.getState() != None and not (y.getState().lower() in self.state.lower()): 691 return False 692 693 return True
694 695
696 - def __eq__(self,y):
697 """ 698 equal operator (==) 699 returns False if the AADs are different 700 else returns True 701 """ 702 703 if not self.name == y.getAID() \ 704 and self.name != None and y.getAID() != None: 705 return False 706 if self.ownership!= y.getOwnership() \ 707 and self.ownership != None and y.getOwnership() != None: 708 return False 709 if self.state != y.getState() \ 710 and self.state != None and y.getState() != None: 711 return False 712 713 return True
714
715 - def __ne__(self,y):
716 """ 717 non equal operator (!=) 718 returns True if the AADs are different 719 else returns False 720 """ 721 return not self == y
722 723
724 - def loadSL0(self,content):
725 """ 726 inits the AAD with a SL string representation 727 """ 728 if content != None: 729 if "name" in content: 730 self.name = AID.aid() 731 self.name.loadSL0(content.name) 732 733 if "ownership" in content: 734 self.ownership = content.ownership[0] 735 736 if "state" in content: 737 self.state = content.state[0]
738
739 - def asContentObject(self):
740 """ 741 returns a version of the AAD in ContentObject format 742 """ 743 co = ContentObject() 744 try: 745 co["fipa:aid"] = self.name.asContentObject() 746 except: 747 co["fipa:aid"] = ContentObject() 748 co["fipa:ownership"] = str(self.ownership) 749 co["fipa:state"] = str(self.state) 750 return co
751 752
753 - def asRDFXML(self):
754 """ 755 returns a printable version of the AAD in RDF/XML format 756 """ 757 return str(self.asContentObject())
758
759 - def __str__(self):
760 """ 761 returns a printable version of the AAD in SL format 762 """ 763 764 if ( (self.name == None) and (self.ownership == None) and (self.state == None) ): 765 return "None" 766 sb = "(ams-agent-description\n" 767 if (self.name != None): 768 sb = sb + ":name " + str(self.name) + "\n" 769 770 if self.ownership != None: 771 sb += ":ownership " + self.ownership +"\n" 772 773 if self.state != None: 774 sb += ":state " + str(self.state) 775 776 sb = sb + ")\n" 777 return sb
778