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

Source Code for Module spade.ACLMessage

  1  #import time
 
  2  import AID 
  3  import random 
  4  import string 
  5  import cPickle as pickle 
  6  #random.seed(time.time())
 
  7  import content 
  8  import ACLParser 
  9  import xml 
 10  import uuid 
 11  
 
12 -class ACLMessage:
13 """ 14 ACLMessage class stores a message using the ACL language 15 """ 16 ACCEPT_PROPOSAL = 'accept-proposal' 17 AGREE = 'agree' 18 CANCEL = 'cancel' 19 CFP = 'cfp' 20 CALL_FOR_PROPOSAL = 'call-for-proposal' 21 CONFIRM = 'confirm' 22 DISCONFIRM = 'disconfirm' 23 FAILURE = 'failure' 24 INFORM = 'inform' 25 NOT_UNDERSTOOD = 'not-understood' 26 PROPOSE = 'propose' 27 QUERY_IF = 'query-if' 28 QUERY_REF = 'query-ref' 29 REFUSE = 'refuse' 30 REJECT_PROPOSAL = 'reject-proposal' 31 REQUEST = 'request' 32 REQUEST_WHEN = 'request-when' 33 REQUEST_WHENEVER = 'request-whenever' 34 SUBSCRIBE = 'subscribe' 35 INFORM_IF = 'inform-if' 36 PROXY = 'proxy' 37 PROPAGATE = 'propagate' 38 39 cid_base = str("".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))] for a in range(4)])) 40 cid_autocount = 0 41
42 - def __init__(self, performative=None):
43 self._attrs = {} 44 #possible FIPA communicative acts 45 self.commacts = ['accept-proposal', 'agree', 'cancel', \ 46 'cfp', 'call-for-proposal', 'confirm', 'disconfirm', \ 47 'failure', 'inform', 'not-understood', \ 48 'propose', 'query-if', 'query-ref', \ 49 'refuse', 'reject-proposal', 'request', \ 50 'request-when', 'request-whenever', 'subscribe', \ 51 'inform-if', 'proxy', 'propagate'] 52 53 """ 54 if performative and (performative.lower() in self.commacts): 55 self.performative = performative.lower() 56 else: self.performative = None 57 """ 58 if performative and (performative.lower() in self.commacts): 59 self._attrs["performative"] = performative.lower() 60 61 self.sender = None 62 self.receivers = [] 63 self.content = None 64 65 """ 66 self.reply_to = [] 67 self.reply_with = None 68 self.reply_by = None 69 self.in_reply_to = None 70 self.encoding = None 71 self.language = None 72 self.ontology = None 73 self.protocol = None 74 self.conversation_id = str(self.cid_base + str(self.cid_autocount)) 75 self.cid_autocount +=1 76 """ 77 78 #self._attrs['id'] = str(ACLMessage.cid_base + str(ACLMessage.cid_autocount)) 79 #ACLMessage.cid_autocount += 1 80 self._attrs['id'] = str(uuid.uuid4()).replace("-","")
81 82 #self.userDefProps = None 83
84 - def reset(self):
85 """ 86 resets the object 87 its structures are set to its initial value 88 """ 89 self.__init__()
90
91 - def setSender(self, sender):
92 """ 93 set the sender (AID class) 94 """ 95 self.sender = sender
96
97 - def getSender(self):
98 """ 99 returns the sender (AID class) 100 """ 101 return self.sender
102
103 - def addReceiver(self, recv):
104 """ 105 adds a receiver to the list (AID class) 106 """ 107 self.receivers.append(recv)
108
109 - def removeReceiver(self, recv):
110 """ 111 removes a receiver from the list (AID class) 112 """ 113 if recv in self.receivers: 114 self.receivers.remove(recv)
115
116 - def resetReceivers(self):
117 """ 118 clears the list of receivers 119 """ 120 self.receivers = []
121
122 - def getReceivers(self):
123 """ 124 returns the list of reveivers 125 """ 126 return self.receivers
127 128
129 - def addReplyTo(self, re):
130 """ 131 adds a 'reply to' to the list (AID class) 132 """ 133 if isinstance(re,AID.aid): 134 #self.reply_to.append(re) 135 if self._attrs.has_key('reply_to'): 136 self._attrs['reply_to'].append(re) 137 else: 138 self._attrs['reply_to'] = [re]
139
140 - def removeReplyTo(self, re):
141 """ 142 removes a 'reply to' from the list (AID class) 143 """ 144 """ 145 if re in self.reply_to: 146 self.reply_to.remove(re) 147 """ 148 try: 149 self._attrs["reply_to"].remove(re) 150 except: 151 return False 152 153 return True
154
155 - def getReplyTo(self):
156 """ 157 returns a 'reply to' from the list (AID class) 158 """ 159 try: 160 return str(self._attrs["reply_to"]) 161 except: 162 return []
163
164 - def setPerformative(self, p):
165 """ 166 sets the message performative (string) 167 must be in ACLMessage.commacts 168 """ 169 if p and (p.lower() in self.commacts): 170 #self.performative = p.lower() 171 self._attrs["performative"] = p.lower()
172
173 - def getPerformative(self):
174 """ 175 returns the message performative (string) 176 """ 177 try: 178 return str(self._attrs["performative"]) 179 except: 180 return None
181
182 - def setContent(self,c):
183 """ 184 sets the message content (string, bytestream, ...) 185 """ 186 self.content = str(c)
187
188 - def setContentObject(self,co):
189 """ 190 sets the message content in ContentObject format 191 """ 192 self.content = co
193
194 - def getContent(self):
195 """ 196 returns the message content 197 """ 198 try: 199 return self.content.asRDFXML() 200 except: 201 return str(self.content)
202
203 - def getContentObject(self):
204 """ 205 returns the message content in ContentObject format, if possible 206 """ 207 if "str" in str(type(self.content)): 208 try: 209 return content.RDFXML2CO(self.content) 210 except: 211 return None 212 elif "ContentObject" in str(type(self.content)): 213 return self.content 214 else: 215 return None
216
217 - def setReplyWith(self,rw):
218 self._attrs["reply_with"] = str(rw)
219 #self.reply_with = rw 220
221 - def getReplyWith(self):
222 try: 223 return str(self._attrs["reply_with"]) 224 except: 225 return None
226
227 - def setInReplyTo(self, reply):
228 self._attrs["in_reply_to"] = str(reply)
229
230 - def getInReplyTo(self):
231 try: 232 return str(self._attrs["in_reply_to"]) 233 except: 234 return None
235
236 - def setEncoding(self,e):
237 self._attrs["encoding"] = str(e)
238
239 - def getEncoding(self):
240 try: 241 return str(self._attrs["encoding"]) 242 except: 243 return None
244
245 - def setLanguage(self,e):
246 self._attrs["language"] = str(e)
247
248 - def getLanguage(self):
249 try: 250 return str(self._attrs["language"]) 251 except: 252 return None
253
254 - def setOntology(self,e):
255 self._attrs["ontology"] = str(e)
256
257 - def getOntology(self):
258 try: 259 return str(self._attrs["ontology"]) 260 except: 261 return None
262
263 - def setReplyBy(self,e):
264 self._attrs["reply_by"] = str(e)
265
266 - def getReplyBy(self):
267 try: 268 return str(self._attrs["reply_by"]) 269 except: 270 return None
271
272 - def setProtocol(self,e):
273 self._attrs["protocol"] = str(e)
274
275 - def getProtocol(self):
276 try: 277 return str(self._attrs["protocol"]) 278 except: 279 return None
280
281 - def setConversationId(self,e):
282 self._attrs["id"] = str(e)
283
284 - def getConversationId(self):
285 try: 286 return str(self._attrs["id"]) 287 except: 288 return None
289
290 - def createReply(self):
291 """ 292 Creates a reply for the message 293 Duplicates all the message structures 294 exchanges the 'from' AID with the 'to' AID 295 """ 296 297 m = ACLMessage() 298 299 m.setPerformative(self.getPerformative()) 300 #m.setSender(None) 301 #m.receivers = [] 302 #m.reply_to = [] 303 #m.setContent(None) 304 #m.setReplyBy(None) 305 #m.setEncoding(None) 306 if self.getLanguage(): m.setLanguage(self.getLanguage()) 307 if self.getOntology(): m.setOntology(self.getOntology()) 308 if self.getProtocol(): m.setProtocol(self.getProtocol()) 309 if self.getConversationId(): m.setConversationId(self.getConversationId()) 310 311 for i in self.getReplyTo(): 312 m.addReceiver(i) 313 314 if not self.getReplyTo(): 315 m.addReceiver(self.sender) 316 317 if self.getReplyWith(): 318 m.setInReplyTo(self.getReplyWith()) 319 320 #if self.getReplyWith() != None: 321 # m.setConversationId(str(self.getReplyWith())) 322 323 return m
324 325
326 - def __str__(self):
327 p = ACLParser.ACLxmlParser() 328 return p.encodeXML(self)
329
330 - def asString(self):
331 """ 332 returns a printable version of the message in ACL string representation 333 """ 334 335 p = '(' 336 337 p=p+ str(self.getPerformative()) + '\n' 338 if self.sender: 339 p = p + ":sender " + str(self.sender) + "\n" 340 341 if self.receivers: 342 p = p + ":receiver\n (set\n" 343 for i in self.receivers: 344 p=p+ str(i) + '\n' 345 346 p = p + ")\n" 347 if self.content: 348 p = p + ':content "'+ str(self.content) + '"\n' 349 350 if self.getReplyWith(): 351 p = p + ":reply-with " + self.getReplyWith() + '\n' 352 353 if self.getReplyBy(): 354 p = p+ ":reply-by " + self.getReplyBy() + '\n' 355 356 if self.getInReplyTo(): 357 p = p+ ":in-reply-to " + self.getInReplyTo() + '\n' 358 359 if self.getReplyTo(): 360 p = p+ ":reply-to \n" + '(set\n' 361 for i in self.getReplyTo(): 362 p=p+ i + '\n' 363 p = p + ")\n" 364 365 if self.getLanguage(): 366 p = p+ ":language " + self.getLanguage() + '\n' 367 368 if self.getEncoding(): 369 p = p+ ":encoding " + self.getEncoding() + '\n' 370 371 if self.getOntology(): 372 p = p+ ":ontology " + self.getOntology() + '\n' 373 374 if self.getProtocol(): 375 p = p+ ":protocol " + self.getProtocol() + '\n' 376 377 if self.getConversationId(): 378 p = p+ ":conversation-id " + self.getConversationId() + '\n' 379 380 381 p = p + ")\n" 382 383 return p
384
385 - def serialize(self):
386 """ 387 returns a serialized version of the message 388 """ 389 return pickle.dumps(self)
390
391 - def asHTML(self):
392 """ 393 returns an HTML version of the message ready to be displayed at the WUI 394 """ 395 s = '<table class="servicesT" cellspacing="0">' 396 s += '<tr><td class="servHd">Performative</td><td class="servBodL">'+self.getPerformative()+'</td></tr>' 397 sndr = self.sender.asXML() 398 sndr = sndr.replace(">", "&gt;") 399 sndr = sndr.replace("<", "&lt;") 400 sndr = sndr.replace('"', "&quot;") 401 s += '<tr><td class="servHd">Sender</td><td class="servBodL"><pre>'+sndr+'</pre></td></tr>' 402 recvs = "" 403 for r in self.receivers: 404 escaped = r.asXML() 405 escaped = escaped.replace(">", "&gt;") 406 escaped = escaped.replace("<", "&lt;") 407 escaped = escaped.replace('"', "&quot;") 408 recvs += escaped + "<br />" 409 s += '<tr><td class="servHd">Receivers</td><td class="servBodL"><pre>'+recvs+'</pre></td></tr>' 410 if self.content: 411 cont = self.getContent() 412 try: 413 # Try to beautify the content if it is XML 414 x = xml.dom.minidom.parseString(cont) 415 cont = x.toprettyxml() 416 except: 417 pass 418 cont = cont.replace(">", "&gt;") 419 cont = cont.replace("<", "&lt;") 420 cont = cont.replace('"', "&quot;") 421 s += '<tr><td class="servHd">Content</td><td class="servBodL"><pre>'+cont+'</pre></td></tr>' 422 if self.getReplyWith(): 423 s += '<tr><td class="servHd">Reply With</td><td class="servBodL">'+str(self.getReplyWith())+'</td></tr>' 424 if self.getReplyBy(): 425 s += '<tr><td class="servHd">Reply By</td><td class="servBodL">'+str(self.getReplyBy())+'</td></tr>' 426 if self.getInReplyTo(): 427 s += '<tr><td class="servHd">In Reply To</td><td class="servBodL">'+str(self.getInReplyTo())+'</td></tr>' 428 if self.getReplyTo(): 429 s += '<tr><td class="servHd">Reply To</td><td class="servBodL">'+str(self.getReplyTo())+'</td></tr>' 430 if self.getLanguage(): 431 s += '<tr><td class="servHd">Language</td><td class="servBodL">'+str(self.getLanguage())+'</td></tr>' 432 if self.getEncoding(): 433 s += '<tr><td class="servHd">Encoding</td><td class="servBodL">'+str(self.getEncoding())+'</td></tr>' 434 if self.getOntology(): 435 s += '<tr><td class="servHd">Ontology</td><td class="servBodL">'+str(self.getOntology())+'</td></tr>' 436 if self.getProtocol(): 437 s += '<tr><td class="servHd">Protocol</td><td class="servBodL">'+str(self.getProtocol())+'</td></tr>' 438 if self.getConversationId(): 439 s += '<tr><td class="servHd">Conversation ID</td><td class="servBodL">'+str(self.getConversationId())+'</td></tr>' 440 s += '</table>' 441 return s
442