libraries/edge/opensearch/datasetgranulewriter.py (149 lines of code) (raw):

from types import * import logging import urllib.request, urllib.parse, urllib.error import urllib.parse import http.client from xml.dom.minidom import Document import json import xml.sax.saxutils import datetime import codecs from edge.opensearch.responsewriter import ResponseWriter from edge.dateutility import DateUtility from edge.httputility import HttpUtility from edge.spatialsearch import SpatialSearch import re class DatasetGranuleWriter(ResponseWriter): def __init__(self, configFilePath, requiredParams = None): super(DatasetGranuleWriter, self).__init__(configFilePath, requiredParams) self.solrGranuleResponse = None def get(self, requestHandler): super(DatasetGranuleWriter, self).get(requestHandler) #logging.debug('uri: '+str(requestHandler.request.headers)) startIndex = 0 try: startIndex = requestHandler.get_argument('startIndex') except: pass entriesPerPage = self._configuration.getint('solr', 'entriesPerPage') try: entriesPerPage = requestHandler.get_argument('itemsPerPage') #cap entries per age at 400 if (int(entriesPerPage) > 400): entriesPerPage = 400 except: pass #pretty = True try: if requestHandler.get_argument('pretty').lower() == 'false': self.pretty = False except: pass parameters = ['startTime', 'endTime', 'keyword', 'granuleName', 'datasetId', 'shortName', 'bbox', 'sortBy'] #variables = {} for parameter in parameters: try: value = requestHandler.get_argument(parameter) self.variables[parameter] = value except: pass if 'keyword' in self.variables: self.variables['keyword'] = self.variables['keyword'].replace('*', '') self.variables['keyword'] = self.variables['keyword'].lower() """ if 'bbox' in variables: points = variables['bbox'].split(',') if len(points) == 4: spatialSearch = SpatialSearch( self._configuration.get('service', 'database') ) spatialResult = spatialSearch.searchGranules( int(startIndex), int(entriesPerPage), float(points[0]), float(points[1]), float(points[2]), float(points[3]) ) if len(spatialResult[0]) > 0: variables['granuleIds'] = spatialResult[0] variables['granuleIdsFound'] = spatialResult[1] del variables['bbox'] """ try: self._getSolrResponse(startIndex, entriesPerPage, self.variables) """ solrJson = json.loads(solrResponse) if len(solrJson['response']['docs']) >= 1: dataset = solrJson['response']['docs'][0]['Dataset-ShortName'][0]; logging.debug('Getting solr response for dataset ' + dataset) solrDatasetResponse = self._getSingleSolrDatasetResponse({'shortName' : dataset}) """ except: logging.exception('Failed to get solr response.') """ if 'granuleIdsFound' in variables: #solrJson = json.loads(solrResponse) numFound = solrJson['response']['numFound'] solrJson['response']['numFound'] = int(variables['granuleIdsFound']) solrJson['response']['start'] = int(startIndex) solrJson['responseHeader']['params']['rows'] = numFound solrResponse = json.dumps(solrJson) searchText = '' if 'keyword' in variables: searchText = variables['keyword'] try: openSearchResponse = self._generateOpenSearchResponse( solrResponse, solrDatasetResponse, searchText, self._configuration.get('service', 'url')+requestHandler.request.uri, pretty ) requestHandler.set_header("Content-Type", "application/xml") requestHandler.write(openSearchResponse) except Exception as exception: logging.exception(exception) requestHandler.set_status(404) requestHandler.write('ERROR - ' + str(exception)) """ def _getSolrResponse(self, startIndex, entriesPerPage, variables): query = self._constructSolrQuery(startIndex, entriesPerPage, variables) url = self._configuration.get('solr', 'granuleUrl') httpUtility = HttpUtility() httpUtility.getResponse(url+'/select/?'+query, self._onSolrGranuleResponse) def _constructSolrQuery(self, startIndex, entriesPerPage, variables): #set default sort order sort='Granule-StartTimeLong+desc' queries = [] for key, value in variables.items(): #query = '' if key == 'startTime': startTime = DateUtility.convertISOToUTCTimestamp(value) if startTime is not None: query = 'Granule-StartTimeLong:' query += '['+str(startTime)+'%20TO%20*]' queries.append(query) elif key == 'endTime': stopTime = DateUtility.convertISOToUTCTimestamp(value) if stopTime is not None: query = 'Granule-StartTimeLong:' query += '[*%20TO%20'+str(stopTime)+']' queries.append(query) elif key == 'keyword': newValue = urllib.parse.quote(value) query = 'SearchableText-LowerCased:('+newValue+')' queries.append(query) elif key == 'datasetId': query = 'Dataset-PersistentId:'+self._urlEncodeSolrQueryValue(value) queries.append(query) elif key == 'shortName': query = 'Dataset-ShortName-Full:'+self._urlEncodeSolrQueryValue(value) queries.append(query) elif key == 'granuleName': query = 'Granule-Name-Full:'+self._urlEncodeSolrQueryValue(value) queries.append(query) elif key == 'granuleIds': granuleIds = [] for granuleId in value: granuleIds.append(str(granuleId)) query = 'Granule-Id:('+'+OR+'.join(granuleIds)+')' queries.append(query) startIndex = 0 elif key == 'sortBy': sortByMapping = {'timeAsc': 'Granule-StartTimeLong+asc', 'archiveTimeDesc': 'Granule-ArchiveTimeLong+desc'} if value in list(sortByMapping.keys()): sort = sortByMapping[value] elif key == 'archiveTime': query = 'Granule-ArchiveTimeLong:['+str(value)+'%20TO%20*]' queries.append(query) #if query != '': # queries.append('%2B'+query) if len(queries) == 0: queries.append('*') query = 'q='+'+AND+'.join(queries)+'&fq=Granule-AccessType:(OPEN+OR+PREVIEW+OR+SIMULATED+OR+REMOTE)+AND+Granule-Status:ONLINE&version=2.2&start='+str(startIndex)+'&rows='+str(entriesPerPage)+'&indent=on&wt=json&sort='+sort logging.debug('solr query: '+query) return query def _readTemplate(self, path): file = codecs.open(path, encoding='utf-8') data = file.read() file.close() return data def _generateOpenSearchResponse(self, solrGranuleResponse, solrDatasetResponse, pretty): pass def _onSolrGranuleResponse(self, response): if response.error: self._handleException(str(response.error)) else: self.solrGranuleResponse = response.body solrJson = json.loads(response.body) if len(solrJson['response']['docs']) >= 1: dataset = solrJson['response']['docs'][0]['Dataset-ShortName'][0]; logging.debug('Getting solr response for dataset ' + dataset) self._getSingleSolrDatasetResponse({'shortName' : dataset}, self._onSolrDatasetResponse) else: try: openSearchResponse = self._generateOpenSearchResponse( None, None, self.pretty ) self.requestHandler.set_header("Content-Type", "application/xml") self.requestHandler.write(openSearchResponse) self.requestHandler.finish() except BaseException as exception: self._handleException(str(exception)) def _onSolrDatasetResponse(self, response): if response.error: self._handleException(str(response.error)) else: try: openSearchResponse = self._generateOpenSearchResponse( self.solrGranuleResponse, response.body, self.pretty ) self.requestHandler.set_header("Content-Type", "application/xml") self.requestHandler.write(openSearchResponse) self.requestHandler.finish() except BaseException as exception: self._handleException(str(exception))