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()
Exemple #3
0
                    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