def startElementNS(self, name, qname, attrs): namespace, element = name if namespace == u'http://www.eucalyptus.com/ns/reporting/export/2012-08-24/' and element == u'Export': self.switchTarget( self.generator ) XMLFilterBase.startElementNS(self, name, qname, attrs)
class FragmentFilter(XMLFilterBase): def __init__(self, rules): XMLFilterBase.__init__(self) self.rules = rules self.prefixes = {None: None} self.prefixesStack = {} self.contexts = [FilterContext()] def context(self): return self.contexts[len(self.contexts) - 1] def pushContext(self, ctx=None): if ctx == None: ctx = FilterContext() self.contexts.append(ctx) def popContext(self): del (self.contexts[len(self.contexts) - 1]) def findPrefix(self, uri): for prefix in self.prefixes.keys(): if self.prefixes[prefix] == uri: return prefix return None def startAttribute(self, uri, name, prefix, content, attrs, brk=0): self.pushContext() if not brk: rule = self.rules.match(uri, name, Attribute) if rule != None: self.context().setRule(rule) self.context().appendContent(content) self.context().setMatch() return self.context().rule.getFragmentedAttributes( self, self.context().match, attrs) p = prefix if prefix != None: if not self.prefixes.has_key(prefix): self.startPrefixMapping(prefix, uri) self.context().appendTemporaryPrefix(prefix) if self.prefixes[prefix] != uri: p = self.findPrefix(uri) if p == None: i = 1 p = "%s%d" % (prefix, i) while self.prefixes.has_key(p): i += 1 p = "%s%d" % (prefix, i) self.startPrefixMapping(p, uri) self.context().appendTemporaryPrefix(p) att = attrs._attrs if att.has_key((uri, name)): raise InvalidFragmentException, "Duplicate attribute {%s}%s" % ( uri, name) att[(uri, name)] = content qnames = attrs._qnames if p == None: qname = name else: qname = p + ":" + name qnames[(uri, name)] = qname newattrs = AttributesNSImpl(att, qnames) return newattrs def endAttribute(self): if self.context().rule != None: self.context().rule.fragment(self, self.context().match) for prefix in self.context().temporaryPrefixes: self.endPrefixMapping(prefix) self.popContext() def startElementNS(self, (uri, name), qname, attrs): if self.context().rule != None: raise InvalidFragmentException, "Element {%s}%s found while fragmenting." % ( uri, name) else: self.context().rule = self.rules.match(uri, name, Element) ictx = len(self.contexts) if self.context().rule != None: self.context().setAttrs(attrs) else: newattrs = AttributesNSImpl({}, {}) for ((auri, aname), avalue) in attrs.items(): if attrs._qnames.has_key((auri, aname)): prefix = attrs.getQNameByName( (auri, aname)).split(":")[0] else: prefix = None newattrs = self.startAttribute(auri, aname, prefix, avalue, newattrs) XMLFilterBase.startElementNS(self, (uri, name), qname, newattrs) while len(self.contexts) > ictx: self.endAttribute()
self.endAttribute() def characters(self, content): if self.context().rule==None: XMLFilterBase.characters(self, content) else: self.context().content += content def endElementNS(self, (uri, name), qname): if self.context().rule==None: XMLFilterBase.endElementNS(self, (uri, name), qname) else: ictx = len(self.contexts) self.context().setMatch() attrs = self.context().rule.getFragmentedAttributes(self, self.context().match, self.context().attrs) XMLFilterBase.startElementNS(self, (uri, name), qname, attrs) while len(self.contexts) > ictx: self.endAttribute() self.context().rule.fragment(self, self.context().match) XMLFilterBase.endElementNS(self, (uri, name), qname) for prefix in self.context().temporaryPrefixes: self.endPrefixMapping(prefix) self.context().__init__() def startPrefixMapping(self, prefix, uri): if self.prefixes.has_key(prefix): if self.prefixesStack.has_key(prefix): self.prefixesStack[prefix].append(self.prefixes[prefix]) else: self.prefixesStack[prefix] = [self.prefixes[prefix]] self.prefixes[prefix] = uri
if self.context().rule == None: XMLFilterBase.characters(self, content) else: self.context().content += content def endElementNS(self, (uri, name), qname): if self.context().rule == None: XMLFilterBase.endElementNS(self, (uri, name), qname) else: ictx = len(self.contexts) self.context().setMatch() attrs = self.context().rule.getFragmentedAttributes( self, self.context().match, self.context().attrs) XMLFilterBase.startElementNS(self, (uri, name), qname, attrs) while len(self.contexts) > ictx: self.endAttribute() self.context().rule.fragment(self, self.context().match) XMLFilterBase.endElementNS(self, (uri, name), qname) for prefix in self.context().temporaryPrefixes: self.endPrefixMapping(prefix) self.context().__init__() def startPrefixMapping(self, prefix, uri): if self.prefixes.has_key(prefix): if self.prefixesStack.has_key(prefix): self.prefixesStack[prefix].append(self.prefixes[prefix]) else: self.prefixesStack[prefix] = [self.prefixes[prefix]] self.prefixes[prefix] = uri