def _parse(self, process, wps_request): """Parse request """ LOGGER.debug('Checking if datainputs is required and has been passed') if process.inputs: if wps_request.inputs is None: raise MissingParameterValue('Missing "datainputs" parameter', 'datainputs') LOGGER.debug('Checking if all mandatory inputs have been passed') data_inputs = {} for inpt in process.inputs: LOGGER.debug('Checking input: %s', inpt.identifier) if inpt.identifier not in wps_request.inputs: if inpt.min_occurs > 0: LOGGER.error('Missing parameter value: %s', inpt.identifier) raise MissingParameterValue( inpt.identifier, inpt.identifier) else: # inputs = deque(maxlen=inpt.max_occurs) # inputs.append(inpt.clone()) # data_inputs[inpt.identifier] = inputs pass else: # Replace the dicts with the dict of Literal/Complex inputs # set the input to the type defined in the process. if isinstance(inpt, ComplexInput): data_inputs[inpt.identifier] = self.create_complex_inputs( inpt, wps_request.inputs[inpt.identifier]) elif isinstance(inpt, LiteralInput): data_inputs[inpt.identifier] = self.create_literal_inputs( inpt, wps_request.inputs[inpt.identifier]) elif isinstance(inpt, BoundingBoxInput): data_inputs[inpt.identifier] = self.create_bbox_inputs( inpt, wps_request.inputs[inpt.identifier]) wps_request.inputs = data_inputs # set as_reference to True for all the outputs specified as reference # if the output is not required to be raw if not wps_request.raw: for wps_outpt in wps_request.outputs: is_reference = wps_request.outputs[ wps_outpt].get('asReference', 'false').lower() == 'true' for outpt in process.outputs: if outpt.identifier == wps_outpt: outpt.as_reference = is_reference
def create_bbox_inputs(self, source: BoundingBoxInput, inputs: Iterable[JsonValue]) -> Iterable[BoundingBoxInput]: """ Takes the http_request and parses the input to objects :return collections.deque: """ outinputs = deque(maxlen=source.max_occurs) for inpt in inputs: newinpt = source.clone() newinpt.data = inpt.get('data') crs = inpt.get('crs') if crs: newinpt.crs = crs dimensions = inpt.get('dimensions') if dimensions: newinpt.dimensions = dimensions outinputs.append(newinpt) if len(outinputs) < source.min_occurs: raise MissingParameterValue( description='Number of inputs is lower than minium required number of inputs', locator=source.identifier) return outinputs
def create_literal_inputs(self, source: LiteralInput, inputs: Iterable[JsonValue]) -> Iterable[LiteralInput]: """ Takes the http_request and parses the input to objects :return collections.deque: """ outinputs = deque(maxlen=source.max_occurs) for inpt in inputs: newinpt = source.clone() # set the input to the type defined in the process newinpt.uom = inpt.get('uom') data_type = inpt.get('datatype') if data_type: newinpt.data_type = data_type # get the value of the field newinpt.data = inpt.get('data') outinputs.append(newinpt) if len(outinputs) < source.min_occurs: raise MissingParameterValue(description="Missing literal input data value for %s" % source.identifier, locator=source.identifier) return outinputs
def describe(self, identifiers, **context): """ Return process description """ if not identifiers: raise MissingParameterValue('', 'identifier') # 'all' keyword means all processes if 'all' in (ident.lower() for ident in identifiers): identifiers = [p.identifier for p in self.processes] identifier_elements = [] try: identifier_elements.extend( p.describe_xml() for p in self.get_processes(identifiers, **context)) except UnknownProcessError as exc: raise InvalidParameterValue("Unknown process %s" % exc, "identifier") except Exception as e: LOGGER.critical("Exception:\n%s", traceback.format_exc()) raise NoApplicableCode(str(e), code=500) doc = WPS.ProcessDescriptions(*identifier_elements) doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \ 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd' doc.attrib['service'] = 'WPS' doc.attrib['version'] = '1.0.0' doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US' return doc
def check_and_set_version(self, version): """set this.version """ if not version: raise MissingParameterValue('Missing version', 'version') elif not _check_version(version): raise VersionNegotiationFailed( 'The requested version "%s" is not supported by this server' % version, 'version') else: self.version = version
def parse_post_execute(): """Parse POST Execute request """ version = doc.attrib.get('version') wpsrequest.check_and_set_version(version) language = doc.attrib.get('language') wpsrequest.check_and_set_language(language) wpsrequest.operation = 'execute' identifier = xpath_ns(doc, './ows:Identifier') if not identifier: raise MissingParameterValue('Process identifier not set', 'Identifier') wpsrequest.identifier = identifier[0].text wpsrequest.lineage = 'false' wpsrequest.store_execute = 'false' wpsrequest.status = 'false' wpsrequest.inputs = get_inputs_from_xml(doc) wpsrequest.outputs = get_output_from_xml(doc) wpsrequest.raw = False if xpath_ns(doc, '/wps:Execute/wps:ResponseForm/wps:RawDataOutput'): wpsrequest.raw = True # executeResponse XML will not be stored wpsrequest.store_execute = 'false' # check if response document tag has been set then retrieve response_document = xpath_ns( doc, './wps:ResponseForm/wps:ResponseDocument') if len(response_document) > 0: wpsrequest.lineage = response_document[0].attrib.get( 'lineage', 'false') wpsrequest.store_execute = response_document[0].attrib.get( 'storeExecuteResponse', 'false') # XXX If storeExecuteResponse is set then we enforce # the status supports wpsrequest.status = wpsrequest.store_execute # Set timeout timeout = response_document[0].attrib.get('timeout') wpsrequest.check_and_set_timeout(timeout) # Set expiration expire = response_document[0].attrib.get('expire') wpsrequest.check_and_set_expiration(expire)
def create_bbox_inputs(self, source, inputs): """ Takes the http_request and parses the input to objects :return collections.deque: """ outinputs = deque(maxlen=source.max_occurs) for datainput in inputs: newinpt = source.clone() newinpt.data = [datainput.minx, datainput.miny, datainput.maxx, datainput.maxy] outinputs.append(newinpt) if len(outinputs) < source.min_occurs: raise MissingParameterValue( description='Number of inputs is lower than minium required number of inputs', locator=source.identifier) return outinputs
def create_complex_inputs(self, source: ComplexInput, inputs: Iterable[JsonValue]) -> Iterable[ComplexInput]: """ Create new ComplexInput as clone of original ComplexInput because of inputs can be more then one, take it just as Prototype :return collections.deque: """ outinputs = deque(maxlen=source.max_occurs) for inpt in inputs: data_input = source.clone() frmt = data_input.supported_formats[0] if 'mimeType' in inpt: if inpt['mimeType']: frmt = data_input.get_format(inpt['mimeType']) else: frmt = data_input.data_format if frmt: data_input.data_format = frmt else: raise InvalidParameterValue( 'Invalid mimeType value %s for input %s' % (inpt.get('mimeType'), source.identifier), 'mimeType') # get the referenced input otherwise get the value of the field href = inpt.get('href', None) if href: data_input.method = inpt.get('method', 'GET') data_input.url = href data_input.as_reference = True data_input.body = inpt.get('body',None) else: data_input.data = inpt.get('data') outinputs.append(data_input) if len(outinputs) < source.min_occurs: raise MissingParameterValue(description="Given data input is missing", locator=source.identifier) return outinputs
def describe(self, service: Service, map_uri: Optional[str]=None) -> XMLDocument: """ Return process description """ identifiers = self.identifiers if not identifiers: raise MissingParameterValue('', 'identifier') # 'all' keyword means all processes if 'all' in (ident.lower() for ident in identifiers): identifiers = [p.identifier for p in service.processes] identifier_elements = [] identifier_elements.extend(p.describe_xml() for p in service.get_processes_for_request(identifiers,map_uri=map_uri)) doc = WPS.ProcessDescriptions(*identifier_elements) doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \ 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd' doc.attrib['service'] = 'WPS' doc.attrib['version'] = '1.0.0' doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US' return doc