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

Source Code for Module spade.XMLCodec

  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  
 
10 -class XMLCodec(handler.ContentHandler):
11 """ 12 XML Parser 13 """
14 - def __init__(self):
15 #self.parser = xmlreader.IncrementalParser() 16 #self.parser.setContentHandler(self) 17 #self.parser.setErrorHandler(self) 18 19 self.ToTag = False 20 21 #Constants 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 #self.ENCRYPTED_TAG = "encrypted" 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 # * Encoding methods * 59 # *************************************************** 60 61 """ Encode the information of Agent, Tags To and From """
62 - def encodeAid(self, agentid):
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 """
86 - def encodeTag( self, tag, content ):
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
153 - def encodeOneLineTag( self, tag1, tag2, value ):
154 sb = self.OT + tag1 + " " 155 sb = sb + tag2 + '="' + value + '"/>' 156 157 return sb
158
159 - def encodeXML(self, env):
160 """ 161 General Encoding of the envelope 162 """ 163 164 #Create the message XML 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 #Create tag TO 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 #Create tag from 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 #Create tag comments 182 if env.getComments() != None and len(env.getComments()) > 0: 183 sb = sb + self.encodeTag( self.COMMENTS_TAG, env.getComments() ) 184 185 #Create tag acl-representation 186 if env.getAclRepresentation() != None: 187 sb = sb + self.encodeTag( self.REPRESENTATION_TAG, env.getAclRepresentation() ) 188 189 #Create tag payload-length 190 if env.getPayloadLength() != None: 191 sb = sb + self.encodeTag( self.LENGTH_TAG, str(env.getPayloadLength()) ) 192 193 #Create tag payload-encoding 194 if env.getPayloadEncoding() != None and len(env.getPayloadEncoding()) > 0: 195 sb = sb + self.encodeTag( self.ENCODING_TAG, env.getPayloadEncoding() ) 196 197 #Create tag date 198 #Create object BasicFipaDateTime 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 #Create tag encrypted (NL: not sure it is still in FIPA) 206 """ 207 for i in env.getEncrypted(): 208 sb = sb + self.encodeTag( self.ENCRYPTED_TAG, str(i) ) 209 """ 210 211 #Create tag intended-receiver 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 #Create tag received 224 ro = env.getReceived() 225 if ro != None: 226 #Create tag received 227 sb = sb + self.OT + self.RECEIVED_TAG + self.CT 228 #Date 229 value = BasicFipaDateTime( ro.getDate() ) 230 if value != None: 231 sb = sb + self.encodeOneLineTag( self.RECEIVED_DATE, self.RECEIVED_ATTR, str( value ) ) 232 #By 233 value = ro.getBy() 234 if value != None: 235 sb = sb + self.encodeOneLineTag( self.RECEIVED_BY, self.RECEIVED_ATTR, value ) 236 #From 237 value = ro.getFrom() 238 if value != None: 239 sb = sb + self.encodeOneLineTag( self.RECEIVED_FROM, self.RECEIVED_ATTR, value ) 240 #Id 241 value = ro.getId() 242 if value != None: 243 sb = sb + self.encodeOneLineTag( self.RECEIVED_ID, self.RECEIVED_ATTR, value ) 244 #Via 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 #This method is called when start the document XML
265 - def startDocument(self):
266 self.env = Envelope.Envelope()
267 268 #This method is called at the end of parsing */
269 - def endDocument(self):
270 pass
271 #Put the ro object in to envelope 272 #env.setReceived(ro) 273 274 #This method is called when jmp event of begin element.*/ 275 #def startElement(self, uri, localName, rawName, attributes):
276 - def startElement(self, localName, attributes):
277 278 #Detection of the begin of to or from tags 279 self.accumulator = "" 280 281 if self.TO_TAG.lower() == localName.lower(): 282 self.aid = aid() 283 self.aidTag = self.TO_TAG 284 #self.env.addTo(aid) 285 286 elif self.FROM_TAG.lower() == localName.lower(): 287 self.aid = aid() 288 self.aidTag = self.FROM_TAG 289 #self.env.setFrom(aid) 290 291 elif self.INTENDED_TAG.lower() == localName.lower(): 292 self.aid = aid() 293 self.aidTag = self.INTENDED_TAG 294 #self.env.addIntendedReceiver(self.aid) 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 #This method is called the end of element 323 #def endElement(self, namespaceURL, localName, qname):
324 - def endElement(self, localName):
325 326 #Capture the value the attributes of class 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 #This method is called when exist characters in the elements
382 - def characters(self, buff):
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 # Main method #
410 - def parse(self, _in):
411 """ 412 parses the xml input 413 """ 414 xml.sax.parseString(_in, self) 415 return self.env
416