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
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))
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
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
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
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