Esempio n. 1
0
    def _build_value(self, entries, deep=False):
        """
        Constructs a DataObject from list of tree entries
        @param entries  list of TreeEntry instances with values
        @param deep  boolean flag, indicates whether subtree value should be
                loaded or kept as ValueRef
        @retval a DataObject
        """
        if not entries:
            return
        dobj = DataObject()
        for entry in entries:
            valname = entry.entry['name']
            value = entry.value
            if isinstance(value, TreeValue):
                if deep:
                    tentries = yield self.vs.get_tree_entriesvalues(value)
                    # @todo Should this maybe a container DataObject?
                    vdo = self._build_value(tentries, deep)
                    if vdo:
                        dobj.set_attr(valname, vdo)
                else:
                    # Put only a the tree value object in
                    # @todo Check if this is OK in a DataObject
                    dobj.set_attr(valname, value)
            elif isinstance(value, ValueObject):
                if type(value.value) is dict:
                    # case where a DataObject was encoded
                    vdo = DataObject.from_encoding(value.value)
                    vdo.identity = value.identity
                else:
                    # case where value is a simple value
                    vdo = DataObject()
                    vdo.identity = value.identity
                    vdo.set_attr('value', value.value)

                if len(entries) == 1:
                    defer.returnValue(vdo)
                    return
                dobj.set_attr(valname, vdo)
            else:
                raise RuntimeError('Unknown value type in store: '+repr(value))

        defer.returnValue(dobj)