1 import xml.sax
2 from xml.sax import handler
3 from BasicFipaDateTime import *
4 from AID import *
5 from ReceivedObject import ReceivedObject
6 import Envelope
7
8
9
11 """
12 XML Parser
13 """
15
16
17
18
19 self.ToTag = False
20
21
22 self.ENVELOPE_TAG = "envelope"
23 self.PARAMS_TAG = "params"
24 self.INDEX = "index"
25 self.INDEX_ATTR = ' index="'
26 self.TO_TAG = "to"
27 self.AID_TAG = "agent-identifier"
28 self.AID_NAME = "name"
29 self.AID_ADDRESSES = "addresses"
30 self.AID_ADDRESS = "url"
31 self.FROM_TAG = "from"
32 self.COMMENTS_TAG = "comments"
33 self.REPRESENTATION_TAG = "acl-representation"
34 self.LENGTH_TAG = "payload-length"
35 self.ENCODING_TAG = "payload-encoding"
36 self.DATE_TAG = "date"
37
38 self.INTENDED_TAG = "intended-receiver"
39 self.RECEIVED_TAG = "received"
40 self.RECEIVED_DATE = "received-date"
41 self.RECEIVED_BY = "received-by"
42 self.RECEIVED_FROM = "received-from"
43 self.RECEIVED_ID = "received-id"
44 self.RECEIVED_VIA = "received-via"
45 self.RECEIVED_ATTR = "value"
46 self.PROP_TAG = "user-defined"
47 self.PROP_ATTR = "href"
48 self.PROP_ATTR_TYPE = "type"
49 self.PROP_STRING_TYPE ="string"
50 self.PROP_BYTE_TYPE="byte-array"
51 self.PROP_SER_TYPE="serialized"
52 self.OT = "<"
53 self.ET = "</"
54 self.CT = ">"
55 self.NULL = ""
56
57
58
59
60
61 """ Encode the information of Agent, Tags To and From """
63
64 if not isinstance(agentid, aid):
65 return ""
66
67 sb = self.OT + self.AID_TAG + self.CT
68 sb = sb + self.encodeTag( self.AID_NAME, agentid.getName() )
69 sb = sb + self.OT + self.AID_ADDRESSES + self.CT
70
71 addresses = agentid.getAddresses()
72 for addr in addresses:
73 sb = sb + self.encodeTag( self.AID_ADDRESS, addr )
74
75 sb = sb + self.ET + self.AID_ADDRESSES + self.CT
76 sb = sb + self.ET + self.AID_TAG + self.CT
77
78 return sb
79
80 """
81 This does the following:
82 < tag >
83 content
84 </ tag >
85 """
87 sb = self.OT + tag + self.CT
88 sb = sb + content
89 sb = sb + self.ET + tag + self.CT
90
91 return sb
92
93 """
94 A user-defined property (String name, Object value) is encoded the following way:
95 <user-defined href="name" type="type">value</user-defined>
96 """
97 """
98 def encodeProp( self, prop):
99 v = None
100 Object o = p.getValue();
101 String type = PROP_STRING_TYPE;
102 if (o instanceof String) {
103 v = (String)o;
104 }
105 else if (o instanceof byte[]) {
106 type = PROP_BYTE_TYPE;
107 v = new String(Base64.encode((byte[])o));
108 }
109 else if (o instanceof Serializable) {
110 type = PROP_SER_TYPE;
111 try{
112 ByteArrayOutputStream bos = new ByteArrayOutputStream();
113 ObjectOutputStream oos = new ObjectOutputStream(bos);
114 oos.writeObject(o);
115 oos.close();
116 byte[] bytes = bos.toByteArray();
117 if(bytes != null)
118 v = new String(Base64.encode(bytes));
119 }catch(IOException ioe){
120 return;
121 }
122 }
123 else {
124 return;
125 }
126 sb.append(OT).append(PROP_TAG).append(" ");
127 sb.append(PROP_ATTR).append("=\"").append(p.getName()).append("\" ");
128 sb.append(PROP_ATTR_TYPE).append("=\"").append(type).append("\"");
129 sb.append(CT);
130 sb.append(v);
131 sb.append(ET).append(PROP_TAG).append(CT);
132 }
133 private void decodeProp(StringBuffer acc, Property p) {
134 if(propType.equals(PROP_SER_TYPE)){
135 try{
136 char[] serdata = acc.toString().toCharArray();
137 ObjectInputStream ois = new ObjectInputStream(
138 new ByteArrayInputStream(Base64.decode(serdata)));
139 p.setValue((Serializable)ois.readObject());
140 }catch(Exception e){
141 // nothing, we leave value of this property as null;
142 }
143 }else if(propType.equals(PROP_BYTE_TYPE)){
144 char[] bytes = acc.toString().toCharArray();
145 p.setValue(Base64.decode(bytes));
146 }else{
147 p.setValue(acc.toString());
148 }
149 propType = null;
150 }
151 """
152
154 sb = self.OT + tag1 + " "
155 sb = sb + tag2 + '="' + value + '"/>'
156
157 return sb
158
160 """
161 General Encoding of the envelope
162 """
163
164
165 sb = self.OT + self.ENVELOPE_TAG + self.CT
166 sb = sb + self.OT + self.PARAMS_TAG + self.INDEX_ATTR + "1" + '"' + self.CT
167
168
169 tos = env.getTo()
170 for agentid in tos:
171 sb = sb + self.OT + self.TO_TAG + self.CT
172 sb = sb + self.encodeAid(agentid)
173 sb = sb + self.ET + self.TO_TAG + self.CT
174
175
176 if env.getFrom() != None:
177 sb = sb + self.OT + self.FROM_TAG + self.CT
178 sb = sb + self.encodeAid( env.getFrom() )
179 sb = sb + self.ET + self.FROM_TAG + self.CT
180
181
182 if env.getComments() != None and len(env.getComments()) > 0:
183 sb = sb + self.encodeTag( self.COMMENTS_TAG, env.getComments() )
184
185
186 if env.getAclRepresentation() != None:
187 sb = sb + self.encodeTag( self.REPRESENTATION_TAG, env.getAclRepresentation() )
188
189
190 if env.getPayloadLength() != None:
191 sb = sb + self.encodeTag( self.LENGTH_TAG, str(env.getPayloadLength()) )
192
193
194 if env.getPayloadEncoding() != None and len(env.getPayloadEncoding()) > 0:
195 sb = sb + self.encodeTag( self.ENCODING_TAG, env.getPayloadEncoding() )
196
197
198
199 if env.getDate() != None:
200 date = BasicFipaDateTime()
201 date.fromString( str(env.getDate()) )
202 sb = sb + self.encodeTag( self.DATE_TAG, str(date) )
203
204
205
206 """
207 for i in env.getEncrypted():
208 sb = sb + self.encodeTag( self.ENCRYPTED_TAG, str(i) )
209 """
210
211
212 for i in env.getIntendedReceiver():
213 sb = sb + self.OT + self.INTENDED_TAG + self.CT
214 sb = sb + self.encodeAid(i)
215 sb = sb + self.ET + self.INTENDED_TAG + self.CT
216
217 """
218 #Create tags for user properties
219 for (i=env.getAllProperties();i.hasNext();) {
220 encodeProp(sb,(Property)i.next());
221 """
222
223
224 ro = env.getReceived()
225 if ro != None:
226
227 sb = sb + self.OT + self.RECEIVED_TAG + self.CT
228
229 value = BasicFipaDateTime( ro.getDate() )
230 if value != None:
231 sb = sb + self.encodeOneLineTag( self.RECEIVED_DATE, self.RECEIVED_ATTR, str( value ) )
232
233 value = ro.getBy()
234 if value != None:
235 sb = sb + self.encodeOneLineTag( self.RECEIVED_BY, self.RECEIVED_ATTR, value )
236
237 value = ro.getFrom()
238 if value != None:
239 sb = sb + self.encodeOneLineTag( self.RECEIVED_FROM, self.RECEIVED_ATTR, value )
240
241 value = ro.getId()
242 if value != None:
243 sb = sb + self.encodeOneLineTag( self.RECEIVED_ID, self.RECEIVED_ATTR, value )
244
245 value = ro.getVia()
246 if value != None:
247 sb = sb + self.encodeOneLineTag( self.RECEIVED_VIA, self.RECEIVED_ATTR, value )
248
249 sb = sb + self.ET + self.RECEIVED_TAG + self.CT
250
251
252
253 sb = sb + self.ET + self.PARAMS_TAG + self.CT
254 sb = sb + self.ET + self.ENVELOPE_TAG + self.CT
255
256 return sb
257
258 """
259 ***************************************************
260 * Decoding methods *
261 ***************************************************
262 """
263
264
267
268
271
272
273
274
275
277
278
279 self.accumulator = ""
280
281 if self.TO_TAG.lower() == localName.lower():
282 self.aid = aid()
283 self.aidTag = self.TO_TAG
284
285
286 elif self.FROM_TAG.lower() == localName.lower():
287 self.aid = aid()
288 self.aidTag = self.FROM_TAG
289
290
291 elif self.INTENDED_TAG.lower() == localName.lower():
292 self.aid = aid()
293 self.aidTag = self.INTENDED_TAG
294
295
296 elif self.RECEIVED_TAG.lower() == localName.lower():
297 self.env.setReceived(ReceivedObject())
298
299 elif self.RECEIVED_BY.lower() == localName.lower():
300 self.env.received.setBy( attributes.getValue(self.RECEIVED_ATTR) )
301
302 elif self.RECEIVED_FROM.lower() == localName.lower():
303 self.env.received.setFrom( attributes.getValue(self.RECEIVED_ATTR) )
304
305 elif self.RECEIVED_DATE.lower() == localName.lower():
306 self.env.received.setDate( BasicFipaDateTime( str(attributes.getValue(self.RECEIVED_ATTR) )) )
307
308 elif self.RECEIVED_ID.lower() == localName.lower():
309 self.env.received.setId( attributes.getValue(self.RECEIVED_ATTR) )
310
311 elif self.RECEIVED_VIA.lower() == localName.lower():
312 self.env.received.setVia( attributes.getValue(self.RECEIVED_ATTR) )
313
314 """
315 elif self.PROP_TAG.lower() == localName.lower():
316 prop = Property()
317 env.addProperties(prop)
318 prop.setName(attributes.getValue(self.PROP_ATTR))
319 propType = attributes.getValue(self.PROP_ATTR_TYPE)
320 """
321
322
323
325
326
327 if self.AID_NAME.lower() == localName.lower():
328 self.aid.setName(self.accumulator)
329
330 elif self.AID_ADDRESS.lower() == localName.lower():
331 self.aid.addAddress(self.accumulator)
332
333 elif self.TO_TAG.lower() == localName.lower():
334 self.aidTag = ""
335
336 elif self.FROM_TAG.lower() == localName.lower():
337 self.aidTag = ""
338
339 elif self.INTENDED_TAG.lower() == localName.lower():
340 self.aidTag = ""
341
342 elif self.AID_TAG.lower() == localName.lower():
343 if self.aidTag == self.TO_TAG:
344 self.env.addTo(self.aid)
345 elif self.aidTag == self.FROM_TAG:
346 self.env.setFrom(self.aid)
347 elif self.aidTag == self.INTENDED_TAG:
348 self.env.addIntendedReceiver(self.aid)
349
350 elif self.COMMENTS_TAG.lower() == localName.lower():
351 self.env.setComments(self.accumulator)
352
353 elif self.REPRESENTATION_TAG.lower() == localName.lower():
354 self.env.setAclRepresentation(self.accumulator)
355
356 elif self.LENGTH_TAG.lower() == localName.lower():
357 self.env.setPayloadLength( long(self.accumulator) )
358 """
359 if(logger.isLoggable(Logger.WARNING))
360 logger.log(Logger.FINE,"Length: "+env.getPayloadLength());
361 """
362
363 elif self.ENCODING_TAG.lower() ==localName.lower():
364 self.env.setPayloadEncoding(self.accumulator)
365
366 elif self.DATE_TAG.lower() == localName.lower():
367 bfdt= BasicFipaDateTime()
368 bfdt.fromString(str(self.accumulator))
369 self.env.setDate( bfdt )
370
371 """
372 elif self.PROP_TAG.lower() == localName.lower():
373 decodeProp(accumulator, prop);
374 """
375 """
376 #Not sure it is still in FIPA
377 elif self.ENCRYPTED_TAG.lower() == localName.low():
378 self.env.addEncrypted(accumulator)
379 """
380
381
383 self.accumulator = self.accumulator + buff
384
385 """
386 /** This method is called when warning occur*/
387 public void warning(SAXParseException exception) {
388 if(logger.isLoggable(Logger.WARNING))
389 logger.log(Logger.WARNING," line " + exception.getLineNumber() + ": "+
390 exception.getMessage());
391 }
392
393 /** This method is called when errors occur*/
394 public void error(SAXParseException exception) {
395 if(logger.isLoggable(Logger.WARNING))
396 logger.log(Logger.WARNING,"ERROR: line " + exception.getLineNumber() + ": " +
397 exception.getMessage());
398 }
399
400 /** This method is called when non-recoverable errors occur.*/
401 public void fatalError(SAXParseException exception) throws SAXException{
402 if(logger.isLoggable(Logger.WARNING))
403 logger.log(Logger.SEVERE,"FATAL: line " + exception.getLineNumber() + ": " +
404 exception.getMessage());
405 throw exception;
406 }
407 """
408
409
411 """
412 parses the xml input
413 """
414 xml.sax.parseString(_in, self)
415 return self.env
416