164 lines
No EOL
5.8 KiB
Python
164 lines
No EOL
5.8 KiB
Python
#
|
|
# GempakDataURIRequest
|
|
#
|
|
# This code has been developed by the SIB for use in the AWIPS2 system.
|
|
# Performs a query of a database table ncgrib and returns datauri string.
|
|
# Could be re-factored for other tables.
|
|
#
|
|
# Usage:
|
|
# import GempakDataURIRequest
|
|
# query = GempakDataURIRequest.GempakDataURIRequest("grib")
|
|
# query.setDataParms("datauri!GDFILE|DATTIM|GVCORD|GLEVEL|GPARM")
|
|
# return query.execute();
|
|
#
|
|
# SOFTWARE HISTORY
|
|
#
|
|
# Date Ticket# Engineer Description
|
|
# ------------ ---------- ----------- --------------------------
|
|
# 04/30/10 173_partC mgamazaychikov Initial Creation
|
|
# 05/05/11 mgamazaychikov Allowed the separator to be '!' or ':'
|
|
# 08/17/11 mgamazaychikov Re-wrote to use TableQuery class
|
|
#
|
|
|
|
from java.util import ArrayList
|
|
from com.raytheon.uf.common.message.response import ResponseMessageGeneric
|
|
from com.raytheon.uf.edex.database.plugin import PluginFactory
|
|
from com.raytheon.edex.uengine.tasks.query import TableQuery
|
|
from gov.noaa.nws.ncep.edex.uengine.utility import GempakConvert
|
|
|
|
class GempakDataURIRequest():
|
|
|
|
def __init__(self, pluginName):
|
|
#
|
|
# create the TableQuery instance
|
|
#
|
|
try:
|
|
className = PluginFactory.getInstance().getPluginRecordClassName(pluginName)
|
|
except:
|
|
#
|
|
# handle the exception if the plugin record class cannot be found
|
|
#
|
|
message = "RunTimeError getting the PluginRecordClassName for " + \
|
|
pluginName + " "
|
|
import sys
|
|
if sys.exc_info()[1] is not None:
|
|
str = "%s" % sys.exc_info()[1]
|
|
indx = str.find("\n")
|
|
if indx > 0:
|
|
message = message + str[:indx]
|
|
print "Unexpected error:" + message
|
|
return self.__makeNullResponse(message)
|
|
databaseName = "metadata"
|
|
#
|
|
# create the TableQuery instance for specified database
|
|
# and plugin record class
|
|
#
|
|
self.query = TableQuery(databaseName,className)
|
|
|
|
def setDataParms(self, inpStr):
|
|
#
|
|
# find out which separator is used - "!" or ":"
|
|
#
|
|
if inpStr.find("!") < 0:
|
|
sepChar = ":"
|
|
else:
|
|
sepChar = "!"
|
|
#
|
|
# list of field names in inpStr delineated by by '|'
|
|
#
|
|
nameList = self.__getNamelist()
|
|
#
|
|
# list of values in inpStr delineated by by '|'
|
|
#
|
|
parmsList = (inpStr.split(sepChar)[1]).split("|")
|
|
#
|
|
# dictionary of name-value based on inpStr
|
|
#
|
|
inpDict = dict(zip(nameList, parmsList))
|
|
#
|
|
# modify the dictionary items to make them db centric
|
|
#
|
|
refTime, fcstTime = self.__getDbTime(inpDict["dattim"])
|
|
print "refTime2=", refTime
|
|
print "fcstTime2=", fcstTime
|
|
inpDict["dataTime.refTime"] = refTime[0:-2]
|
|
inpDict["dataTime.fcstTime"]= fcstTime
|
|
#inpDict["dataTime.refTime"], inpDict["dataTime.fcstTime"] = self.__getDbTime(inpDict["dattim"])
|
|
del inpDict["dattim"]
|
|
inpDict["modelName"] = self.__getDbModelInfo(inpDict["modelName"])
|
|
#
|
|
# set to return dataURI field
|
|
#
|
|
self.query.addReturnedField("dataURI", None)
|
|
#
|
|
# set the query parameters
|
|
#
|
|
print "inpDict=", inpDict
|
|
for key, value in inpDict.items():
|
|
self.query.addParameter (key, value)
|
|
|
|
def execute(self):
|
|
#
|
|
# execute the set query
|
|
#
|
|
try:
|
|
queryResult = ArrayList()
|
|
queryResult = self.query.execute()
|
|
size = queryResult.size()
|
|
print "queryResult = ", queryResult
|
|
print "queryResult size = ", size
|
|
except:
|
|
message = "RunTimeError executing TableQuery "
|
|
import sys
|
|
if sys.exc_info()[1] is not None:
|
|
str = "%s" % sys.exc_info()[1]
|
|
indx = str.find("\n")
|
|
if indx > 0:
|
|
message = message + str[:indx]
|
|
print "Unexpected error:" + message
|
|
return self.__makeNullResponse(message)
|
|
#
|
|
# process the results of the query
|
|
#
|
|
if queryResult is None or size==0:
|
|
return self.__makeNullResponse("Error query returned no results")
|
|
else:
|
|
return self.__makeResponse(queryResult)
|
|
|
|
def __isMixed(self, s):
|
|
seen_upper = seen_lower = False
|
|
for c in s:
|
|
if c.isupper(): seen_upper = True
|
|
if c.islower(): seen_lower = True
|
|
if seen_upper and seen_lower:
|
|
return True
|
|
return False
|
|
|
|
def __getNamelist (self):
|
|
return ['modelName', 'dattim', 'vcord', 'glevel1', 'parm', 'eventName']
|
|
|
|
def __getDbTime (self, aDattim):
|
|
refTime = aDattim.upper().split("F")[0]
|
|
fcstTime = "%s" % (int(aDattim.upper().split("F")[1]) * 3600)
|
|
convert = GempakConvert()
|
|
refTime = convert.dattimToDbtime(refTime)
|
|
print "refTime=", refTime
|
|
print "fcstTime=", fcstTime
|
|
return refTime, fcstTime
|
|
|
|
def __getDbModelInfo (self, aMdl):
|
|
if self.__isMixed( aMdl ):
|
|
return aMdl
|
|
else:
|
|
return aMdl.upper()
|
|
|
|
def __makeResponse(self, aResponse):
|
|
response = ArrayList()
|
|
aResponse0 = "%s" % aResponse.get(0)
|
|
print "aResponse=", aResponse
|
|
print "aResponse0=", aResponse0
|
|
response.add(ResponseMessageGeneric(aResponse0))
|
|
return response
|
|
|
|
def __makeNullResponse(self, aMessage=None):
|
|
return ResponseMessageGeneric(aMessage) |