1
2 import AID
3 import random
4 import string
5 import cPickle as pickle
6
7 import content
8 import ACLParser
9 import xml
10 import uuid
11
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
43 self._attrs = {}
44
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
79
80 self._attrs['id'] = str(uuid.uuid4()).replace("-","")
81
82
83
85 """
86 resets the object
87 its structures are set to its initial value
88 """
89 self.__init__()
90
92 """
93 set the sender (AID class)
94 """
95 self.sender = sender
96
98 """
99 returns the sender (AID class)
100 """
101 return self.sender
102
104 """
105 adds a receiver to the list (AID class)
106 """
107 self.receivers.append(recv)
108
110 """
111 removes a receiver from the list (AID class)
112 """
113 if recv in self.receivers:
114 self.receivers.remove(recv)
115
117 """
118 clears the list of receivers
119 """
120 self.receivers = []
121
123 """
124 returns the list of reveivers
125 """
126 return self.receivers
127
128
130 """
131 adds a 'reply to' to the list (AID class)
132 """
133 if isinstance(re,AID.aid):
134
135 if self._attrs.has_key('reply_to'):
136 self._attrs['reply_to'].append(re)
137 else:
138 self._attrs['reply_to'] = [re]
139
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
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
172
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
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
218 self._attrs["reply_with"] = str(rw)
219
220
222 try:
223 return str(self._attrs["reply_with"])
224 except:
225 return None
226
228 self._attrs["in_reply_to"] = str(reply)
229
231 try:
232 return str(self._attrs["in_reply_to"])
233 except:
234 return None
235
237 self._attrs["encoding"] = str(e)
238
240 try:
241 return str(self._attrs["encoding"])
242 except:
243 return None
244
246 self._attrs["language"] = str(e)
247
249 try:
250 return str(self._attrs["language"])
251 except:
252 return None
253
255 self._attrs["ontology"] = str(e)
256
258 try:
259 return str(self._attrs["ontology"])
260 except:
261 return None
262
264 self._attrs["reply_by"] = str(e)
265
267 try:
268 return str(self._attrs["reply_by"])
269 except:
270 return None
271
273 self._attrs["protocol"] = str(e)
274
276 try:
277 return str(self._attrs["protocol"])
278 except:
279 return None
280
282 self._attrs["id"] = str(e)
283
285 try:
286 return str(self._attrs["id"])
287 except:
288 return None
289
324
325
329
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
386 """
387 returns a serialized version of the message
388 """
389 return pickle.dumps(self)
390
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(">", ">")
399 sndr = sndr.replace("<", "<")
400 sndr = sndr.replace('"', """)
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(">", ">")
406 escaped = escaped.replace("<", "<")
407 escaped = escaped.replace('"', """)
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
414 x = xml.dom.minidom.parseString(cont)
415 cont = x.toprettyxml()
416 except:
417 pass
418 cont = cont.replace(">", ">")
419 cont = cont.replace("<", "<")
420 cont = cont.replace('"', """)
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