def v1(self, req): self._response.set_header('Content-Type', 'application/xml') current_version = 1.2 default_corp_list = settings.get('corpora', 'default_corpora', []) corpname = None if 0 == len(default_corp_list): _logger.critical( 'FCS cannot work properly without a default_corpora set') else: corpname = default_corp_list[0] pr = urllib.parse.urlparse(req.host_url) # None values should be filled in later data = { 'corpname': corpname, 'corppid': None, 'version': current_version, 'recordPacking': 'xml', 'result': [], 'operation': None, 'numberOfRecords': 0, 'server_name': pr.hostname, 'server_port': pr.port or 80, 'database': req.path, 'maximumRecords': None, 'maximumTerms': None, 'startRecord': None, 'responsePosition': None, } # supported parameters for all operations supported_args = [ 'operation', 'stylesheet', 'version', 'extraRequestData' ] try: # check operation operation = req.args.get('operation', 'explain') data['operation'] = operation # check version version = req.args.get('version', None) if version is not None and current_version < float(version): raise Exception(5, version, 'Unsupported version') # check integer parameters maximumRecords = req.args.get('maximumRecords', 250) if 'maximumRecords' in req.args: try: maximumRecords = int(maximumRecords) if maximumRecords <= 0: raise Exception(6, 'maximumRecords', 'Unsupported parameter value') except: raise Exception(6, 'maximumRecords', 'Unsupported parameter value') data['maximumRecords'] = maximumRecords maximumTerms = req.args.get('maximumTerms', 100) if 'maximumTerms' in req.args: try: maximumTerms = int(maximumTerms) except: raise Exception(6, 'maximumTerms', 'Unsupported parameter value') data['maximumTerms'] = maximumTerms startRecord = req.args.get('startRecord', 1) if 'startRecord' in req.args: try: startRecord = int(startRecord) if startRecord <= 0: raise Exception(6, 'startRecord', 'Unsupported parameter value') except: raise Exception(6, 'startRecord', 'Unsupported parameter value') data['startRecord'] = startRecord responsePosition = req.args.get('responsePosition', 0) if 'responsePosition' in req.args: try: responsePosition = int(responsePosition) except: raise Exception(6, 'responsePosition', 'Unsupported parameter value') data['responsePosition'] = responsePosition # set content-type in HTTP header recordPacking = req.args.get('recordPacking', 'xml') if recordPacking == 'xml': pass elif recordPacking == 'string': # TODO(jm)!!! self._response.set_header('Content-Type', 'text/plain; charset=utf-8') else: raise Exception(71, 'recordPacking', 'Unsupported record packing') # provide info about service if operation == ' te dal': self._check_args( req, supported_args, ['recordPacking', 'x-fcs-endpoint-description']) corpus = self.cm.get_corpus(corpname) data['result'] = corpus.get_posattrs() data['numberOfRecords'] = len(data['result']) data['corpus_desc'] = 'Corpus {0} ({1} tokens)'.format( corpus.get_conf('NAME'), l10n.simplify_num(corpus.size)) data['corpus_lang'] = Languages.get_iso_code( corpus.get_conf('LANGUAGE')) data['show_endpoint_desc'] = (True if req.args.get( 'x-fcs-endpoint-description', 'false') == 'true' else False) # wordlist for a given attribute elif operation == 'scan': self._check_args(req, supported_args, [ 'scanClause', 'responsePosition', 'maximumTerms', 'x-cmd-resource-info' ]) data['resourceInfoRequest'] = req.args.get( 'x-cmd-resource-info', '') == 'true' scanClause = req.args.get('scanClause', '') if scanClause.startswith('fcs.resource='): value = scanClause.split('=')[1] data['result'] = self._corpora_info(value, maximumTerms) else: data['result'] = conclib.fcs_scan(corpname, scanClause, maximumTerms, responsePosition) # simple concordancer elif operation == 'searchRetrieve': # TODO we should review the args here (especially x-cmd-context, resultSetTTL) self._check_args(req, supported_args, [ 'query', 'startRecord', 'maximumRecords', 'recordPacking', 'recordSchema', 'resultSetTTL', 'x-cmd-context', 'x-fcs-context' ]) if 'x-cmd-context' in req.args: req_corpname = req.args['x-cmd-context'] user_corpora = plugins.runtime.AUTH.instance.permitted_corpora( self.session_get('user')) if req_corpname in user_corpora: corpname = req_corpname else: _logger.warning( 'Requested unavailable corpus [%s], defaulting to [%s]', req_corpname, corpname) data['corpname'] = corpname corp_conf_info = plugins.runtime.CORPARCH.instance.get_corpus_info( self._plugin_ctx, corpname) data['corppid'] = corp_conf_info.get('web', '') query = req.args.get('query', '') corpus = self.cm.get_corpus(corpname) if 0 == len(query): raise Exception(7, 'fcs_query', 'Mandatory parameter not supplied') data['result'], data['numberOfRecords'] = self.fcs_search( corpus, corpname, query, maximumRecords, startRecord) # unsupported operation else: # show within explain template data['operation'] = 'explain' raise Exception(4, '', 'Unsupported operation') # catch exception and amend diagnostics in template except Exception as e: data['message'] = ('error', repr(e)) try: data['code'], data['details'], data['msg'] = e except (ValueError, TypeError): data['code'], data['details'] = 1, repr(e) data['msg'] = 'General system error' return data
def v1(self, req): self._headers['Content-Type'] = 'application/xml' current_version = 1.2 default_corp_list = settings.get('corpora', 'default_corpora', []) corpname = None if 0 == len(default_corp_list): _logger.critical('FCS cannot work properly without a default_corpora set') else: corpname = default_corp_list[0] pr = urlparse.urlparse(req.host_url) # None values should be filled in later data = { 'corpname': corpname, 'corppid': None, 'version': current_version, 'recordPacking': 'xml', 'result': [], 'operation': None, 'numberOfRecords': 0, 'server_name': pr.hostname, 'server_port': pr.port or 80, 'database': req.path, 'maximumRecords': None, 'maximumTerms': None, 'startRecord': None, 'responsePosition': None, } # supported parameters for all operations supported_args = ['operation', 'stylesheet', 'version', 'extraRequestData'] try: # check operation operation = req.args.get('operation', 'explain') data['operation'] = operation # check version version = req.args.get('version', None) if version is not None and current_version < float(version): raise Exception(5, version, 'Unsupported version') # check integer parameters maximumRecords = req.args.get('maximumRecords', 250) if 'maximumRecords' in req.args: try: maximumRecords = int(maximumRecords) if maximumRecords <= 0: raise Exception(6, 'maximumRecords', 'Unsupported parameter value') except: raise Exception(6, 'maximumRecords', 'Unsupported parameter value') data['maximumRecords'] = maximumRecords maximumTerms = req.args.get('maximumTerms', 100) if 'maximumTerms' in req.args: try: maximumTerms = int(maximumTerms) except: raise Exception(6, 'maximumTerms', 'Unsupported parameter value') data['maximumTerms'] = maximumTerms startRecord = req.args.get('startRecord', 1) if 'startRecord' in req.args: try: startRecord = int(startRecord) if startRecord <= 0: raise Exception(6, 'startRecord', 'Unsupported parameter value') except: raise Exception(6, 'startRecord', 'Unsupported parameter value') data['startRecord'] = startRecord responsePosition = req.args.get('responsePosition', 0) if 'responsePosition' in req.args: try: responsePosition = int(responsePosition) except: raise Exception(6, 'responsePosition', 'Unsupported parameter value') data['responsePosition'] = responsePosition # set content-type in HTTP header recordPacking = req.args.get('recordPacking', 'xml') if recordPacking == 'xml': pass elif recordPacking == 'string': # TODO(jm)!!! self._headers['Content-Type'] = 'text/plain; charset=utf-8' else: raise Exception(71, 'recordPacking', 'Unsupported record packing') # provide info about service if operation == 'explain': self._check_args( req, supported_args, ['recordPacking', 'x-fcs-endpoint-description'] ) corpus = self.cm.get_Corpus(corpname) import_str = partial(l10n.import_string, from_encoding=corpus.get_conf('ENCODING')) data['result'] = corpus.get_conf('ATTRLIST').split(',') data['numberOfRecords'] = len(data['result']) data['corpus_desc'] = u'Corpus {0} ({1} tokens)'.format( import_str(corpus.get_conf('NAME')), l10n.simplify_num(corpus.size())) data['corpus_lang'] = Languages.get_iso_code(corpus.get_conf('LANGUAGE')) data['show_endpoint_desc'] = (True if req.args.get('x-fcs-endpoint-description', 'false') == 'true' else False) # wordlist for a given attribute elif operation == 'scan': self._check_args( req, supported_args, ['scanClause', 'responsePosition', 'maximumTerms', 'x-cmd-resource-info'] ) data['resourceInfoRequest'] = req.args.get('x-cmd-resource-info', '') == 'true' scanClause = req.args.get('scanClause', '') if scanClause.startswith('fcs.resource='): value = scanClause.split('=')[1] data['result'] = self._corpora_info(value, maximumTerms) else: data['result'] = conclib.fcs_scan( corpname, scanClause, maximumTerms, responsePosition) # simple concordancer elif operation == 'searchRetrieve': # TODO we should review the args here (especially x-cmd-context, resultSetTTL) self._check_args( req, supported_args, ['query', 'startRecord', 'maximumRecords', 'recordPacking', 'recordSchema', 'resultSetTTL', 'x-cmd-context', 'x-fcs-context'] ) if 'x-cmd-context' in req.args: req_corpname = req.args['x-cmd-context'] user_corpora = plugins.runtime.AUTH.instance.permitted_corpora( self.session_get('user')) if req_corpname in user_corpora: corpname = req_corpname else: _logger.warning( 'Requested unavailable corpus [%s], defaulting to [%s]', req_corpname, corpname) data['corpname'] = corpname corp_conf_info = plugins.runtime.CORPARCH.instance.get_corpus_info('en_US', corpname) data['corppid'] = corp_conf_info.get('web', '') query = req.args.get('query', '') corpus = self.cm.get_Corpus(corpname) if 0 == len(query): raise Exception(7, 'fcs_query', 'Mandatory parameter not supplied') data['result'], data['numberOfRecords'] = self.fcs_search( corpus, corpname, query, maximumRecords, startRecord) # unsupported operation else: # show within explain template data['operation'] = 'explain' raise Exception(4, '', 'Unsupported operation') # catch exception and amend diagnostics in template except Exception as e: data['message'] = ('error', repr(e)) try: data['code'], data['details'], data['msg'] = e except ValueError: data['code'], data['details'] = 1, repr(e) data['msg'] = 'General system error' return data