示例#1
0
    def encode_execute_response(self, process, inputs, results, lineage=False):
        response_elem = WPS("ExecuteResponse",
            self.encode_process_brief(process),
            WPS("Status",
                WPS("ProcessSucceded"), # TODO: other states
                creationTime=isoformat(now())
            )
        )

        if lineage:
            response_elem.append(
                WPS("DataInputs",

                )
            )

        response_elem.extend((
            WPS("OutputDefinitions", *[
                self.encode_parameter(name, parameter, False)
                for name, parameter in process.outputs.items()
            ]),
            WPS("ProcessOutputs", *[
                self.encode_output(name, process.outputs[name], data)
                for name, data in results.items()
            ])
        ))
        return response_elem
示例#2
0
    def encode_format(self, frmt):
        elem = WPS("Format",
            WPS("MimeType", frmt.mime_type)
        )

        if frmt.encoding:
            elem.append(WPS("Encoding", frmt.encoding))

        if frmt.encoding:
            elem.append(WPS("Schema", frmt.schema))
示例#3
0
def _encode_complex(data, prm):
    """ Encode Data/ComplexData element. """
    try:
        payload = prm.encode_xml(data)
    except (ValueError, TypeError) as exc:
        raise InvalidOutputValueError(prm.identifier, exc)
    elem = WPS("ComplexData", **_encode_format_attr(data, prm))
    if isinstance(payload, etree._Element):
        elem.append(payload)
    else:
        elem.text = etree.CDATA(payload)
    return elem
def _encode_complex(data, prm):
    try:
        payload = prm.encode_xml(data)
    except (ValueError, TypeError) as exc:
        raise InvalidOutputValueError(prm.identifier, exc)

    elem = WPS("ComplexData", **_encode_format_attr(data, prm))
    if isinstance(payload, etree._Element):
        elem.append(payload)
    else:
        elem.text = etree.CDATA(payload)
    return elem
示例#5
0
def _encode_common_response(process, status_elem, inputs, raw_inputs,
                            resp_doc):
    """Encode common execute response part shared by all specific responses."""
    inputs = inputs or {}
    conf = CapabilitiesConfigReader(get_eoxserver_config())
    url = conf.http_service_url
    if url[-1] == "?":
        url = url[:-1]
    elem = WPS(
        "ExecuteResponse",
        encode_process_brief(process),
        WPS("Status", status_elem, creationTime=isoformat(now())),
        {
            "service":
            "WPS",
            "version":
            "1.0.0",
            ns_xml("lang"):
            "en-US",
            "serviceInstance":
            ("%s?service=WPS&version=1.0.0&request=GetCapabilities" % url)
        },
    )

    if resp_doc.lineage:
        inputs_data = []
        for id_, prm in process.inputs:
            if isinstance(prm, RequestParameter):
                continue
            prm = fix_parameter(id_, prm)
            data = inputs.get(id_)
            rawinp = raw_inputs.get(prm.identifier)
            if rawinp is not None:
                inputs_data.append(_encode_input(data, prm, rawinp))
        elem.append(WPS("DataInputs", *inputs_data))

        outputs_def = []
        for id_, prm in process.outputs:
            prm = fix_parameter(id_, prm)
            outdef = resp_doc.get(prm.identifier)
            if outdef is not None:
                outputs_def.append(encode_output_def(outdef))
        elem.append(WPS("OutputDefinitions", *outputs_def))

    return elem
示例#6
0
def _encode_common_response(process, status_elem, inputs, raw_inputs, resp_doc):
    """Encode common execute response part shared by all specific responses."""
    inputs = inputs or {}
    conf = CapabilitiesConfigReader(get_eoxserver_config())
    url = conf.http_service_url
    if url[-1] == "?":
        url = url[:-1]
    elem = WPS("ExecuteResponse",
        encode_process_brief(process),
        WPS("Status", status_elem, creationTime=isoformat(now())),
        {
            "service": "WPS",
            "version": "1.0.0",
            ns_xml("lang"): "en-US",
            "serviceInstance": (
                "%s?service=WPS&version=1.0.0&request=GetCapabilities" % url
            )
        },
    )

    if resp_doc.lineage:
        inputs_data = []
        for id_, prm in process.inputs:
            if isinstance(prm, RequestParameter):
                continue
            prm = fix_parameter(id_, prm)
            data = inputs.get(id_)
            rawinp = raw_inputs.get(prm.identifier)
            if rawinp is not None:
                inputs_data.append(_encode_input(data, prm, rawinp))
        elem.append(WPS("DataInputs", *inputs_data))

        outputs_def = []
        for id_, prm in process.outputs:
            prm = fix_parameter(id_, prm)
            outdef = resp_doc.get(prm.identifier)
            if outdef is not None:
                outputs_def.append(encode_output_def(outdef))
        elem.append(WPS("OutputDefinitions", *outputs_def))

    return elem
示例#7
0
    def encode_parameter(self, name, parameter, is_input):
        # support for the shorthand
        if is_literal_type(parameter):
            parameter = LiteralData(name, parameter)

        # TODO: minOccurs/maxOccurs correct
        elem = WPS("Input" if is_input else "Output",
            OWS("Identifier", parameter.identifier or name)
        )

        if parameter.title:
            elem.append(OWS("Title", parameter.title))
        if parameter.description:
            elem.append(OWS("Abstract", parameter.description))

        if isinstance(parameter, LiteralData):
            data_elem = WPS("LiteralData" if is_input else "LiteralOutput")

            literal_type_name = parameter.type_name
            if literal_type_name:
                data_elem.append(
                    OWS("DataType", literal_type_name, **{
                        ns_ows("reference"): "http://www.w3.org/TR/xmlschema-2/#%s" % literal_type_name
                    })
                )

            if parameter.uoms:
                data_elem.append(
                    WPS("UOMs",
                        WPS("Default",
                            OWS("UOM", parameter.uoms[0])
                        ),
                        WPS("Supported", *[
                            OWS("UOM", uom) for uom in parameter.uoms
                        ])
                    )
                )

            if is_input and parameter.allowed_values:
                data_elem.append(
                    OWS("AllowedValues", *[
                        OWS("AllowedValue", str(allowed_value))
                        for allowed_value in parameter.allowed_values
                    ])
                )
            elif is_input and parameter.values_reference:
                data_elem.append(
                    WPS("ValuesReference", **{
                        ns_ows("reference"): parameter.values_reference,
                        "valuesForm": parameter.values_reference
                    })
                )
            elif is_input:
                data_elem.append(OWS("AnyValue"))

            if is_input and parameter.default is not None:
                elem.attrib["minOccurs"] = "0"
                data_elem.append(
                    WPS("Default", str(parameter.default))
                )

        elif isinstance(parameter, ComplexData):
            formats = parameter.formats
            if isinstance(formats, Format):
                formats = (formats,)

            data_elem = WPS("ComplexData" if is_input else "ComplexOutput",
                WPS("Default",
                    self.encode_format(formats[0])
                ),
                WPS("Supported", *[
                    self.encode_format(frmt) for frmt in formats
                ])
            )

        elif isinstance(parameter, BoundingBoxData):
            # TODO: implement
            data_elem = WPS("BoundingBoxData" if is_input else "BoundingBoxOutput")

        elem.append(data_elem)
        return elem