def readEvent(self,xml): label = self.readTerm(xml.find('label')) compromisetype = self.readText(xml.find('compromisetype')) follows = xml.findall('follows') bindinglist = [] for follow in follows: follaf = follow.find('after') if follaf == None: # Ignore follow definitions that do not contain after continue follev = (int(follaf.get('run')),int(follaf.get('index'))) # Parse and store the binding label blabel = self.readTerm(follow) if blabel != None: binding = (follev,blabel) bindinglist.append(binding) (etype,index) = (xml.get('type'),int(xml.get('index'))) if etype in ('send','read','recv'): fr = self.readTerm(xml.find('from')) to = self.readTerm(xml.find('to')) message = self.readTerm(xml.find('message')) if (etype == 'send'): return Trace.EventSend(index,label,fr,to,message,compromisetype=compromisetype,bindinglist=bindinglist) else: return Trace.EventRead(index,label,fr,to,message,compromisetype=compromisetype,bindinglist=bindinglist) elif xml.get('type') == 'claim': role = self.readTerm(xml.find('role')) etype = self.readTerm(xml.find('type')) argument = self.readTerm(xml.find('argument')) # Freshness claims are implemented as Empty claims with # (Fresh,Value) as arguments try: if etype == 'Empty' and argument[0] == 'Fresh': etype = Term.TermConstant('Fresh') argument = argument[1] elif etype == 'Empty' and argument[0] == 'Compromised': etype = Term.TermConstant('Compromised') argument = argument[1] except: pass return Trace.EventClaim(index,label,role,etype,argument,compromisetype=compromisetype,bindinglist=bindinglist) else: raise Trace.InvalidAction, "Invalid action in XML: %s" % (xml.get('type'))