awips2/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscUtil.py
David Gillingham b97b1766ee Issue #1759: Convert ifpnetCDF and iscMosaic to use more robust request
implementations, convert request handlers to use new python concurrent
framework, excise GfeScript and GfeScriptExecutor from the system.

Change-Id: I801b7b9812a72fdfc72975a311d8dc3806cda152

Conflicts:

	edexOsgi/com.raytheon.edex.plugin.gfe/META-INF/MANIFEST.MF
	edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscUtil.py


Former-commit-id: 5ae3fbd325 [formerly d24fcc85e2] [formerly 56235e370f [formerly 37020656f1502afee59e41ed7daf16775e200cbf]]
Former-commit-id: 56235e370f
Former-commit-id: 60e8146a18
2013-04-04 13:00:36 -05:00

320 lines
No EOL
12 KiB
Python

##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
import string, IrtAccess, JUtil
import xml, pickle, tempfile, os
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
import LogStream
from datetime import datetime
from time import gmtime,strftime
from java.io import File
from com.raytheon.uf.common.time import TimeRange
from com.raytheon.uf.common.dataplugin.gfe.db.objects import GridLocation
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType
from com.raytheon.edex.plugin.gfe.config import IFPServerConfig
from com.raytheon.edex.plugin.gfe.config import IFPServerConfigManager
from com.raytheon.uf.common.serialization import SerializationUtil
from com.raytheon.uf.common.localization import LocalizationFile
from com.raytheon.uf.common.localization import PathManagerFactory
from com.raytheon.uf.common.localization import LocalizationContext
from com.raytheon.uf.common.localization import LocalizationContext_LocalizationType as LocalizationType
from com.raytheon.uf.common.localization import LocalizationContext_LocalizationLevel as LocalizationLevel
#
# Utility module of isc functions
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 07/06/09 1995 bphillip Initial Creation.
# 02/19/13 1637 randerso Removed unused import
# 03/11/13 1759 dgilling Move siteConfig import into
# methods where it's needed.
#
#
#
def getEditArea(name, siteID):
pathMgr = PathManagerFactory.getPathManager();
commonStaticConfig = pathMgr.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.SITE)
commonStaticConfig.setContextName(siteID)
file = pathMgr.getFile(commonStaticConfig,"gfe/editAreas"+ File.separator + name + ".xml")
if not os.path.exists(file.getPath()):
commonStaticConfig = pathMgr.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.CONFIGURED)
commonStaticConfig.setContextName(siteID)
file = pathMgr.getFile(commonStaticConfig,"gfe/editAreas"+ File.separator + name + ".xml")
refData = None
try:
if os.path.exists(file.getPath()):
refData = SerializationUtil.jaxbUnmarshalFromXmlFile(file.getPath());
else:
LogStream.logProblem("EDIT AREA NOT FOUND: ",name," for site ",siteID)
except:
LogStream.logProblem("Unable to unmarshal " + name + " in iscExtract")
return refData
def saveEditAreaGrid(maskName, iscMask, siteID):
iscMask.getPolygons(CoordinateType.LATLON);
pathMgr = PathManagerFactory.getPathManager();
commonStaticConfig = pathMgr.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.CONFIGURED)
commonStaticConfig.setContextName(siteID)
sitePath = pathMgr.getFile(commonStaticConfig,"gfe/editAreas").getPath()
editAreaPath = str(sitePath) + "/" + maskName + ".xml"
SerializationUtil.jaxbMarshalToXmlFile(iscMask, editAreaPath)
def deleteEditArea(name, siteID):
pathMgr = PathManagerFactory.getPathManager()
commonStaticConfig = pathMgr.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.CONFIGURED)
commonStaticConfig.setContextName(siteID)
file = pathMgr.getFile(commonStaticConfig,"gfe/editAreas"+ File.separator + name + ".xml")
file.delete()
def transformTime(tr):
return (int(tr.getStart().getTime() / 1000), int(tr.getEnd().getTime() / 1000))
def toJavaTimeRange(tr):
return TimeRange(long(tr[0]) * long(1000), long(tr[1]) * long(1000))
def swapCoord(coord):
temp = coord.y
coord.y = coord.x
coord.x = temp
return coord
def serverBoxText(server):
#returns text based on the server dictionary that should be placed
#into the dialog
hostport = None
if server['host'][0:3] in ['dx4', 'px3'] and server['port'] in \
['98000000', '98000001']:
if server['port'] == "98000000":
hostport = server['host'] + "-primary"
elif server['port'] == "98000001":
hostport = server['host'] + "-svcbu"
if hostport is None:
hostport = server['host'] + "/" + server['port']
return server['site'] + "-> " + hostport + "@" + \
server['mhsid'].lower()
def sortServers(a, b):
# sort function for the list of servers. Sorts in priority order for
# most likely to have the data. Order is:
# dx4 or px3 98000000 site==mhsid
# dx4 or px3 98000001 site==mhsid
# dx4 or px3 98000000 site!=mhsid
# dx4 or px3 98000001 site!=mhsid
# all others in random order.
sameSiteA = (a['mhsid'] == a['site'])
sameSiteB = (b['mhsid'] == b['site'])
if sameSiteA and not sameSiteB:
return - 1
elif not sameSiteA and sameSiteB:
return 1
#both are same sites, check for host next
else:
regHostA = (a['host'][0:3] in ['dx4', 'px3'])
regHostB = (b['host'][0:3] in ['dx4', 'px3'])
if regHostA and not regHostB:
return - 1
elif not regHostA and regHostB:
return 1
# same host, but not preferred host
else:
regPortA = (a['port'] == "98000000")
regPortB = (b['port'] == "98000000")
if regPortA and not regPortB:
return - 1
elif not regPortA and regPortB:
return 1
return 1 #must be non-standard, put at end of list
def createDomainDict(xml):
irt = IrtAccess.IrtAccess("")
#decodes the packet of information from the ISC_REQUEST_QUERY call
#to the ifpServer. This info will be used for creating the dialog.
# Returns the domainDict, which is keyed by domain, and contains
# a list of servers (each server in a dictionary with keys of
# mhsid, host, port, protocol, site.
try:
serverTree = ElementTree.ElementTree(ElementTree.XML(xml))
serversE = serverTree.getroot()
except:
LogStream.logProblem('Malformed XML in createDomainDict')
return None
if serversE.tag != "servers":
LogStream.logEvent('servers tag not found in createDomainDict')
return None #invalid xml
#decode XML and create dictionary and parms list
domains = {}
welist = []
serverDictS2T = {} #key=serverinfo, value=text on GUI
serverDictT2S = {} #key=text on GUI, value=serverinfo
for domainE in serversE:
if domainE.tag == "domain":
site = None
for name, value in domainE.items():
if name == "site":
site = value
break
if site is None:
LogStream.logProblem('Malformed domain site XML')
continue
for addressE in domainE.getchildren():
info = irt.decodeXMLAddress(addressE)
if not domains.has_key(site):
domains[site] = []
list = domains[site]
list.append(info)
guiText = serverBoxText(info)
serverDictT2S[guiText] = info
serverDictS2T[str(info)] = guiText
list.sort(sortServers)
domains[site] = list
elif domainE.tag == "welist":
for parmE in domainE.getchildren():
welist.append(parmE.text)
welist.sort()
retVal = {}
retVal['serverDictS2T'] = serverDictS2T
retVal['serverDictT2S'] = serverDictT2S
retVal['domains'] = domains
tempfile.tempdir = "/tmp/"
fname = tempfile.mktemp(".bin")
FILE = open(fname, "w")
pickle.dump(retVal, FILE)
FILE.close()
FILE = open(fname, "r")
lines = FILE.readlines()
FILE.close()
os.remove(fname)
pickledFile = ""
for line in lines:
pickledFile += line
return pickledFile
def unPickle(str):
import pickle,tempfile,os,JUtil
tempfile.tempdir = "/tmp/"
fname = tempfile.mktemp(".bin")
FILE = open(fname,"w")
FILE.write(str)
FILE.close()
FILE = open(fname,"r")
retVal = pickle.load(FILE)
FILE.close()
return retVal
def getRequestXML(xml,selectedServers, selectedWEList):
irt = IrtAccess.IrtAccess("")
selectedServers = JUtil.javaStringListToPylist(selectedServers)
selectedWElist = JUtil.javaStringListToPylist(selectedWEList)
response = unPickle(createDomainDict(xml))
serverDictT2S = response['serverDictT2S']
domainDict = response['domains']
iscReqE = Element('iscrequest')
servers = []
for serverT in selectedServers:
server = serverDictT2S[serverT]
servers.append(server)
irt.addDestinationXML(iscReqE, servers)
welistE = SubElement(iscReqE, 'welist')
for we in selectedWElist:
weE = SubElement(welistE, 'parm')
weE.text = we
# output the list of servers and their priority
s = '\n'
for key in domainDict.keys():
s += "DOMAIN=" + key + '\n'
servers = selectedServers
for serverT in servers:
server = serverDictT2S[serverT]
if server['site'] == key:
s += " mhs=" + server['mhsid'] + " host=" + \
server['host'] + " port=" + server['port'] + "\n"
#LogStream.logEvent("Chosen request servers:", s)
# send to ifpServer
xmlreq = ElementTree.tostring(iscReqE)
return xmlreq;
def getLogger(scriptName, logName=None):
import logging
# be relocating this import here we allow
# com.raytheon.edex.plugin.gfe.isc.IscScript to dynamically
# modify its include path with the proper siteConfig just before
# execution time
import siteConfig
if logName is None:
logPath=siteConfig.GFESUITE_LOGDIR+"/"+strftime("%Y%m%d", gmtime())
logName=scriptName+".log"
else:
logPath=os.path.dirname(logName)
if len(logPath)==0:
logPath=siteConfig.GFESUITE_LOGDIR+"/"+strftime("%Y%m%d", gmtime())
logName=os.path.basename(logName)
logFile=logPath+"/"+logName
if not os.path.exists(logPath):
os.makedirs(logPath)
theLog = logging.getLogger(scriptName)
theLog.setLevel(logging.INFO)
ch = logging.FileHandler(logFile)
ch.setLevel(logging.INFO)
formatter = logging.Formatter("%(levelname)s %(asctime)s [%(process)d:%(thread)d] %(filename)s: %(message)s")
ch.setFormatter(formatter)
for h in theLog.handlers:
theLog.removeHandler(h)
theLog.addHandler(ch)
return theLog
def tupleToString(*msg):
concatMsg=""
for m in msg:
concatMsg=concatMsg+" "+str(m)
return concatMsg