[TransWarp] Component hierarchy traversal

Radek Kanovsky rk at dat.cz
Wed Oct 1 11:48:59 EDT 2003


I have started to implement traverseComponents(comp) generator, that
traverses given component hierarchy and return one component-path pair
in one iteration. Traversal order is not important. There are some
components dispersed in hierarchy that implements some interface. I need
to find them and call its methods. But I am not sure if my solution is
correct or if it is ever possible doing it such way. My first prototype
is here:

    def traverseComponents (comp, reg=None) :
        if reg is None :
            reg = {}
        yield (comp, binding.getComponentPath(comp))
        reg[comp] = 1
        for a,d in comp.__class__.__all_descriptors__.items() :
            if not isinstance(d, binding.Attribute) :
            i = comp._getBinding(a)
            try :
                if i in reg :
            except TypeError :
            if not isinstance(i, binding.Component) :
            if not hasattr(comp.__class__, '__all_descriptors__') :
            for x in traverseComponents(i, reg) :
                yield x

    # Usage
    for c,p in traverseComponents(root) :
        a = adapt(c, interfaces.IResourceComponent, default=None)
        if a is None :

Another solution that i have tried was global registry of such
components. Every interfaces.IResourceComponent class has attribute
that is computed upon assembly. Side effect of this computation is that
instances register itself in global registry. Then I have all such
components in registry and I have no need for traversal function. But
some bindings don't have uponAssembly flag set and I don't know how to
force assembling from given root. root.uponAssembly() works only if
whole hierarchy is binded with uponAssembly flag.

Is there some pattern how to solve this?


Radek Kanovsky

More information about the PEAK mailing list