Example #1
0
    def clone_object(self, mgr, tome, type_info):
        clone = tome.__class__(tome.name)

        # props
        for ii in range(len(tome.props)):
            prop = tome.props[ii]
            clone_prop = clone.props[ii]
            marshaller = mgr.require_data_marshaller(prop.value_type.clazz)
            clone_prop.value = marshaller.clone_data(mgr, prop.value, prop.value_type)

        # additional non-pop tomes
        for child_tome in tome.values():
            if util.get_prop(tome, child_tome.name) is None:
                marshaller = mgr.require_data_marshaller(child_tome.type_info.clazz)
                clone.add_tome(marshaller.clone_data(mgr, child_tome, child_tome.type_info))
        return clone
Example #2
0
    def _load_tome_now(self, tome, reader, template=None):
        # props
        self._load_tome_props(tome, reader, template)

        # load additional non-prop tomes from the reader
        for tome_reader in reader.children:
            if util.get_prop(tome, tome_reader.name) is None:
                tome.add_tome(self.load_tome(tome_reader))

        # add additional non-prop tomes from the template
        if template is not None:
            for template_tome in template.values():
                if template_tome.name not in tome:
                    tome.add_tome

        # clone any additional tomes inside our template
        if template is not None:
            for tmplChild in template.values():
                if not tmplChild.name in tome:
                    tome.add_tome(self.clone(tmplChild))
Example #3
0
    def _load_tome_props(self, tome, reader, template=None):
        # template's class must be equal to, or subclass of, tome's class
        if template is not None and not isinstance(template, tome.__class__):
            raise LoadError(reader.data, "Incompatible template [tome_name=%s, tome_class=%s, template_name=%s, template_class=%s" %
                            (tome.name, str(tome.__class__), template.name, str(template.__class__)))

        for prop in tome.props:
            # if we have a tome template, get its corresponding prop
            t_prop = None
            if template is not None:
                t_prop = util.get_prop(template, prop.name)
                LOG.debug("template prop [tome=%s, prop=%s]" % (template, t_prop))
                if t_prop is None:
                    raise LoadError(reader.data, "Missing prop in template [template=%s, prop=%s]" % (template.name, prop.name))

            # load the prop
            try:
                self._load_tome_prop(tome, prop, t_prop, reader)
            except LoadError:
                raise
            except Exception as e:
                raise LoadError(reader.data, "Error loading prop '%s'" % prop.name, cause=e)