Exemplo n.º 1
0
    def _deserialize_dynamic_obj(
        self,
        element: ET.Element,
        metadata: ObjectMeta,
    ) -> typing.Any:
        obj = metadata.object(
        )  # type: ignore[misc] # Caller always sets object
        self.obj[element.attrib["RefId"]] = obj

        for obj_property in element:
            if obj_property.tag == "TN":
                for obj_type in obj_property:
                    obj.types.append(obj_type.text)
                self.tn[obj_property.attrib["RefId"]] = obj.types
            elif obj_property.tag == "TNRef":
                obj.types = self.tn[obj_property.attrib["RefId"]]
            elif obj_property.tag == "Props":
                for adapted_property in obj_property:
                    key = adapted_property.attrib["N"]
                    value = self.deserialize(adapted_property, clear=False)
                    obj.adapted_properties[key] = value
            elif obj_property.tag == "MS":
                for extended_property in obj_property:
                    key = extended_property.attrib["N"]
                    value = self.deserialize(extended_property, clear=False)
                    obj.extended_properties[key] = value
            elif obj_property.tag == "ToString":
                value = self.deserialize(obj_property, clear=False)
                obj.to_string = value
            else:
                value = self.deserialize(obj_property, clear=False)
                obj.property_sets.append(value)

        return obj
Exemplo n.º 2
0
    def _deserialize_obj(
        self,
        element: ET.Element,
        metadata: ObjectMeta,
    ) -> typing.Any:
        obj = metadata.object(
        )  # type: ignore[misc] # Caller always sets object
        self.obj[element.attrib["RefId"]] = obj

        to_string_value = element.find("ToString")
        if to_string_value is not None:
            obj._to_string = self._deserialize_string(to_string_value.text)

        def deserialize_property(
            prop_tag: str, properties: typing.Tuple[typing.Tuple[str,
                                                                 ObjectMeta],
                                                    ...]) -> None:
            for attr, property_meta in properties:
                if attr == "invocation_info":
                    a = ""
                property_name = "Unknown"
                property_filter = ""
                if property_meta.name is not None:
                    property_name = property_meta.name
                    property_filter = "[@N='%s']" % property_meta.name

                tags = [property_meta.tag]
                # The below tags are actually seen as Obj in the parent element
                if property_meta.tag in [
                        "DCT", "LST", "IE", "QUE", "STK", "ObjDynamic"
                ]:
                    tags = ["Obj", "Ref"]

                val = None
                for tag in tags:
                    val = element.find("%s%s%s" %
                                       (prop_tag, tag, property_filter))
                    if val is not None:
                        break

                if val is None and not property_meta.optional:
                    val = element.find("%sNil%s" % (prop_tag, property_filter))
                    if val is None:
                        obj_name = str(
                            obj) if obj._to_string is not None else "Unknown"
                        err_msg = "Mandatory return value for '%s' was not found on object %s" % (
                            property_name,
                            obj_name,
                        )
                        raise SerializationError(err_msg)
                    val = None
                elif val is not None:
                    val = self.deserialize(val, property_meta, clear=False)

                setattr(obj, attr, val)

        deserialize_property("", obj._property_sets)
        deserialize_property("Props/", obj._adapted_properties)
        deserialize_property("MS/", obj._extended_properties)

        return obj