From 7eac415eaa2184852871978ef95c07a02bd6888b Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Fri, 1 May 2015 16:12:48 -0400 Subject: [PATCH] ASM #17024 - Merge tag 'OB_14.4.1-33' into MERGE-14.4.1-33 Merge 14.4.1-33 into 15.1.1-8 Change-Id: Iaebe94615f952be4b294aea0bcba04117b903e9c Former-commit-id: 1f63e395c67afa5106bde7b96b72d4b3111221d3 --- build/deploy.edex.awips2/esb/bin/setup.env | 6 +- .../esb/conf/spring/edex.xml | 2 +- .../static/win32.amd64/alertviz/alertviz.bat | 25 +- cave/build/static/win32.amd64/cave/cave.bat | 25 +- .../gfe/userPython/procedures/BOIVerify.py | 11 +- .../textUtilities/headline/FormatterRunner.py | 21 +- .../DR17194/convertSerpConfigToUtility.py | 96 +++++++ .../edex/plugin/gfe/db/dao/GFEDao.java | 4 +- .../base/config/gfe/serverConfig.py | 12 +- .../base/grid/gfeLevelMappingFile.xml | 24 ++ .../base/grid/parameterInfo/nwpsTrkngCG0.xml | 11 +- .../base/smartinit/nwpsTrkngCG0.py | 120 ++++---- .../META-INF/MANIFEST.MF | 2 + .../uf/edex/dat/utils/FreezingLevel.java | 2 + .../sport/edex/plugin/lma/LmaDecoder.java | 41 +-- .../base/colormaps/LMA/LMA_1.cmap | 258 +++++++++++++++++ .../base/colormaps/LMA/LMA_2.cmap | 261 ++++++++++++++++++ .../{lma/nalma.cmap => LMA/LMA_default.cmap} | 6 +- .../common_static/base/menus/lma/lma.xml | 188 ++++++------- .../styleRules/lma/lmaImageryStyleRules.xml | 38 ++- .../common/configuration/Wes2BridgeCase.java | 19 +- .../META-INF/MANIFEST.MF | 5 +- .../com.raytheon.wes2bridge.manager/build.xml | 5 +- .../manager/IQpidConfigurationXML.java | 48 ---- .../wes2bridge/manager/Wes2BridgeManager.java | 148 ++++------ .../patch/etc/pqact.conf.template | 25 +- rpms/legal/Master_Rights_File.pdf | Bin 157121 -> 157203 bytes 27 files changed, 950 insertions(+), 453 deletions(-) create mode 100755 deltaScripts/14.3.3/DR17194/convertSerpConfigToUtility.py create mode 100644 edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_1.cmap create mode 100644 edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_2.cmap rename edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/{lma/nalma.cmap => LMA/LMA_default.cmap} (99%) delete mode 100644 javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/IQpidConfigurationXML.java diff --git a/build/deploy.edex.awips2/esb/bin/setup.env b/build/deploy.edex.awips2/esb/bin/setup.env index 3d76c08938..a3f3e4c5f1 100644 --- a/build/deploy.edex.awips2/esb/bin/setup.env +++ b/build/deploy.edex.awips2/esb/bin/setup.env @@ -23,6 +23,8 @@ export DB_PORT=5432 # setup connection to qpid export BROKER_ADDR=localhost +export BROKER_PORT=5672 +export BROKER_HTTP=8180 # setup hdf5 connection if pypies is enabled export PYPIES_SERVER=http://localhost:9582 @@ -32,9 +34,9 @@ export PYPIES_SERVER=http://localhost:9582 export HTTP_PORT=9581 export HTTP_SERVER_PATH=/services export HTTP_SERVER=http://localhost:${HTTP_PORT}${HTTP_SERVER_PATH} -export JMS_SERVER=tcp://${BROKER_ADDR}:5672 +export JMS_SERVER=tcp://${BROKER_ADDR}:${BROKER_PORT} export JMS_VIRTUALHOST=edex -export JMS_CONNECTIONS_URL=http://${BROKER_ADDR}:8180/api/v2/connection/${JMS_VIRTUALHOST} +export JMS_CONNECTIONS_URL=http://${BROKER_ADDR}:${BROKER_HTTP}/api/v2/connection/${JMS_VIRTUALHOST} export RADAR_SERVER=tcp://localhost:8813 # set the AWIPS II shared directory diff --git a/build/deploy.edex.awips2/esb/conf/spring/edex.xml b/build/deploy.edex.awips2/esb/conf/spring/edex.xml index 1ab4339a3d..28e52c27c7 100644 --- a/build/deploy.edex.awips2/esb/conf/spring/edex.xml +++ b/build/deploy.edex.awips2/esb/conf/spring/edex.xml @@ -14,7 +14,7 @@ - + diff --git a/cave/build/static/win32.amd64/alertviz/alertviz.bat b/cave/build/static/win32.amd64/alertviz/alertviz.bat index 6798716f96..b6b641bab0 100644 --- a/cave/build/static/win32.amd64/alertviz/alertviz.bat +++ b/cave/build/static/win32.amd64/alertviz/alertviz.bat @@ -1,28 +1,14 @@ @echo OFF -REM Always use the System32 (64-bit) reg.exe. -SET REG_EXE=C:\Windows\System32\reg.exe - REM Determine where we are located. SET CONTAINING_DIRECTORY=%~dp0 REM Prepare the environment. -REM Registry Query Variables. -SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" -REM Determine where AWIPS II Java (the jre) is located. -%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( -SET JavaJreDirectory=%%B) -REM Determine where AWIPS II Python is located. -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( -SET PythonInstallDirectory=%%B) +REM Location of AWIPS II Java (the jre). +SET JavaJreDirectory=C:\Program Files\Raytheon\AWIPS II\Java\jre7 +REM Location of AWIPS II Python. +SET PythonInstallDirectory=C:\Program Files\Raytheon\AWIPS II\Python REM Add Java and Python to the path. SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% @@ -36,9 +22,6 @@ SET PythonPath=%PythonInstallDirectory%;%PythonPath% REM Eliminate variables that will no longer be used. SET PythonInstallDirectory= SET JavaJreDirectory= -SET REG_EXE= -SET A2_JAVA_REG= -SET A2_PYTHON_REG= REM Determine where we will be logging to. SET HOME_DIRECTORY=%USERPROFILE% diff --git a/cave/build/static/win32.amd64/cave/cave.bat b/cave/build/static/win32.amd64/cave/cave.bat index 6a42f2ec40..a343b81be7 100644 --- a/cave/build/static/win32.amd64/cave/cave.bat +++ b/cave/build/static/win32.amd64/cave/cave.bat @@ -1,28 +1,14 @@ @echo OFF -REM Always use the System32 (64-bit) reg.exe. -SET REG_EXE=C:\Windows\System32\reg.exe - REM Determine where we are located. SET CONTAINING_DIRECTORY=%~dp0 REM Prepare the environment. -REM Registry Query Variables. -SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" -REM Determine where AWIPS II Java (the jre) is located. -%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( -SET JavaJreDirectory=%%B) -REM Determine where AWIPS II Python is located. -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( -SET PythonInstallDirectory=%%B) +REM Location of AWIPS II Java (the jre). +SET JavaJreDirectory=C:\Program Files\Raytheon\AWIPS II\Java\jre7 +REM Location of AWIPS II Python. +SET PythonInstallDirectory=C:\Program Files\Raytheon\AWIPS II\Python REM Add Java and Python to the path. SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% @@ -39,9 +25,6 @@ SET PythonPath=%PythonInstallDirectory%;%PythonPath% REM Eliminate variables that will no longer be used. SET PythonInstallDirectory= SET JavaJreDirectory= -SET REG_EXE= -SET A2_JAVA_REG= -SET A2_PYTHON_REG= REM Determine where we will be logging to. SET HOME_DIRECTORY=%USERPROFILE% diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/BOIVerify.py b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/BOIVerify.py index a353bdd237..e215fbd3fd 100644 --- a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/BOIVerify.py +++ b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/procedures/BOIVerify.py @@ -56,7 +56,8 @@ # ------------ ---------- ----------- -------------------------- # 12/02/2014 RM #625 ryu Changed checkGroup() as suggested to display models # in multi-columns when a single column is insufficient. -# +# 04/16/2015 17390 ryu Replacing string.atoi with int for string/integer to integer conversion +# (ListBox.curselection() now returns ints instead of strings.) # ---------------------------------------------------------------------------- # MenuItems = ["Verify"] @@ -6629,7 +6630,7 @@ class Verif(BVDialog): outlist=[] itemnums=self.ForecasterListbox.curselection() try: - itemnums=map(string.atoi,itemnums) + itemnums=map(int,itemnums) except ValueError: pass for itemnum in itemnums: outlist.append(self.forecasterNumbers[itemnum]) @@ -6805,7 +6806,7 @@ class Verif(BVDialog): def getFromdayListbox(self): itemnums=self.FromdayListbox.curselection() try: - itemnums=map(string.atoi,itemnums) + itemnums=map(int,itemnums) except ValueError: pass itemnum=itemnums[0] outdate=self.gridDays[itemnum] @@ -6818,7 +6819,7 @@ class Verif(BVDialog): outlist=[] itemnums=self.DaylistListbox.curselection() try: - itemnums=map(string.atoi,itemnums) + itemnums=map(int,itemnums) except ValueError: pass for itemnum in itemnums: outlist.append(self.gridDays[itemnum]) @@ -7792,7 +7793,7 @@ class Verif(BVDialog): outlist=[] itemnums=listbox.curselection() try: - itemnums=map(string.atoi,itemnums) + itemnums=map(int,itemnums) except ValueError: pass for itemnum in itemnums: outlist.append(listbox.get(itemnum)) diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/FormatterRunner.py b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/FormatterRunner.py index 9a878a2c22..7f3248a7d7 100644 --- a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/FormatterRunner.py +++ b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/FormatterRunner.py @@ -38,6 +38,8 @@ from java.io import File # ------------ ---------- ----------- -------------------------- # 05/29/08 njensen Initial Creation. # 12/10/14 #14946 ryu Add getTimeZones() function. +# 04/16/15 #14946 ryu Fix getTimeZones to return the office TZ if timezone +# is not set for any zone in a segment. # 04/20/2015 #4027 randerso Fixes for formatter autotests # # @@ -441,19 +443,18 @@ def getTimeZones(zones, officeTZ): timezones = [] if zones is not None: for zone in JUtil.javaStringListToPylist(zones): - area_dict = AreaDictionary.AreaDictionary.get(zone) - if area_dict is None: - continue - tzs = area_dict.get("ugcTimeZone") - if tzs is not None: - if type(tzs) is str: - tzs = [tzs] - for tz in tzs: - if tz not in timezones: - timezones.append(tz) + zdict = AreaDictionary.AreaDictionary.get(zone, {}) + tzs = zdict.get("ugcTimeZone", []) + if type(tzs) is str: + tzs = [tzs] + for tz in tzs: + if tz not in timezones: + timezones.append(tz) if officeTZ in timezones and officeTZ != timezones[0]: timezones.remove(officeTZ) timezones.insert(0, officeTZ) + if len(timezones) == 0: + timezones.append(officeTZ) return JUtil.pylistToJavaStringList(timezones) def reloadModule(moduleName): diff --git a/deltaScripts/14.3.3/DR17194/convertSerpConfigToUtility.py b/deltaScripts/14.3.3/DR17194/convertSerpConfigToUtility.py new file mode 100755 index 0000000000..65436f6c7d --- /dev/null +++ b/deltaScripts/14.3.3/DR17194/convertSerpConfigToUtility.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + + +import sys, os, glob, shutil, pwd + + +def main(): + + REMOVE = """#============================================================================== +# +# The following empty code is here to fool the ifpServer into +# thinking it's a tool. This is so that the configuration will +# appear right next to the primary tool. +# +# DO NOT CHANGE THE LINES BELOW +# +ToolType = "numeric" +WeatherElementEdited = "None" +from numpy import * +HideTool = 1 + +import SmartScript + +class Tool (SmartScript.SmartScript): + def __init__(self, dbss): + SmartScript.SmartScript.__init__(self, dbss) + def execute(self): + return +""" + + dryrun = 0 + if len(sys.argv) > 1 and sys.argv[1] == "-dry": + dryrun = 1 + + print "running %s with dryrun = %d\n\n" % (sys.argv[0], dryrun) + + pws = pwd.getpwnam("awips") + + + cavestatic = '/awips2/edex/data/utility/cave_static' + tool_subpaths = 'gfe/userPython/smartTools' + util_subpaths = 'gfe/userPython/utilities' + tool_list = glob.glob(cavestatic + "/*/*/" + tool_subpaths + "/SerpConfig*.py") + util_list = glob.glob(cavestatic + "/*/*/" + util_subpaths + "/SerpConfig*.py") + print "current tool files:" + print tool_list + print "\ncurrent utilities:" + print util_list + + for f in tool_list: + print "\nworking from %s" % f + dirn, filen = os.path.split(f) + utildir = dirn.replace("smartTools", "utilities") + newfile = os.path.join(utildir, "SerpConfig.py") + if os.path.exists(newfile): + print "%s already exists. No need to create." % newfile + else: + content = open(f).read() + replaced = content.replace(REMOVE, "") + if not dryrun: + if not os.path.exists(utildir): + os.makedirs(utildir) + open(newfile, 'w+').write(replaced) + print "create new file %s" % newfile + + if not dryrun: + if not os.path.exists(newfile): + print "Error: file %s is not created." % newfile + else: + os.chown(newfile, pws.pw_uid, pws.pw_gid) + os.chmod(newfile, 644) + + if filen == "SerpConfig.py": + print "removing override %s" % f + if not dryrun: + os.remove(f) + + print "" + for f in util_list: + dirn, filen = os.path.split(f) + utildir = dirn + newfile = os.path.join(utildir, "SerpConfig.py") + if not os.path.exists(newfile): + if not dryrun: + shutil.copy(f, newfile) + print "create new file %s from %s" % (newfile, filen) + if not dryrun: + if not os.path.exists(newfile): + print "Error: file %s is not created." % newfile + else: + os.chown(newfile, pws.pw_uid, pws.pw_gid) + pass + + +if __name__ == "__main__": + main() diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java index e1ce7c2b28..a6be72c2d6 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java @@ -107,6 +107,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * 06/12/14 #3244 randerso Improved error handling * 09/21/2014 #3648 randerso Changed to do version purging when new databases are added * 10/16/2014 3454 bphillip Upgrading to Hibernate 4 + * 04/28/2015 17435 randerso Fix getLatestDbIdByModelName(). * * * @@ -1372,7 +1373,8 @@ public class GFEDao extends DefaultPluginDao { public List doInTransaction( TransactionStatus status) { - Query query = getCurrentSession().createQuery("FROM DatabaseID WHERE siteId = :siteId AND modelName = :modelName ORDER BY modelTime DESC LIMIT 1"); + Query query = getCurrentSession().createQuery("FROM DatabaseID WHERE siteId = :siteId AND modelName = :modelName ORDER BY modelTime DESC"); + query.setMaxResults(1); query.setParameter("siteId", siteId); query.setParameter("modelName",modelName); return query.list(); diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/config/gfe/serverConfig.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/config/gfe/serverConfig.py index a0a3962be4..500cbcbe19 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/config/gfe/serverConfig.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/config/gfe/serverConfig.py @@ -61,6 +61,10 @@ # 04/08/2015 #4383 dgilling Define FireWX ISC configuration parameters. # # for Fcst/Official. +# 04/15/2015 #17383 yteng Change localTC to fix error that time constraints +# being off +# being off +# 04/20/2015 #4414 dgilling Add missing NWPSTrkngCG0 weather elements. # ######################################################################## @@ -218,6 +222,7 @@ Wave_6 = ("Wave_6", VECTOR, "ft", "Wave_6", 50.0, 0.0, 2, NO) Wave_7 = ("Wave_7", VECTOR, "ft", "Wave_7", 50.0, 0.0, 2, NO) Wave_8 = ("Wave_8", VECTOR, "ft", "Wave_8", 50.0, 0.0, 2, NO) Wave_9 = ("Wave_9", VECTOR, "ft", "Wave_9", 50.0, 0.0, 2, NO) +Wave_10 = ("Wave_10", VECTOR, "ft", "Wave_10", 50.0, 0.0, 2, NO) #Fcst Grids - for partitioned wave groups Wave1 = ("Wave1", VECTOR, "ft", "WAVE1", 50.0, 0.0, 1, NO) @@ -229,6 +234,7 @@ Wave6 = ("Wave6", VECTOR, "ft", "WAVE6", 50.0, 0.0, 1, NO) Wave7 = ("Wave7", VECTOR, "ft", "Wave7", 50.0, 0.0, 0, NO) Wave8 = ("Wave8", VECTOR, "ft", "Wave8", 35.0, 0.0, 0, NO) Wave9 = ("Wave9", VECTOR, "ft", "Wave9", 35.0, 0.0, 0, NO) +Wave10 = ("Wave10", VECTOR, "ft", "Wave10", 35.0, 0.0, 0, NO) #Smart Init Grids - for partitioned wave groups Period_1 = ("Period_1", SCALAR, "sec", "Period_1", 30.0, 1.0, 0, NO) @@ -240,6 +246,7 @@ Period_6 = ("Period_6", SCALAR, "sec", "Period_6", 30.0, 0.0, 0, NO) Period_7 = ("Period_7", SCALAR, "sec", "Period_7", 30.0, 0.0, 0, NO) Period_8 = ("Period_8", SCALAR, "sec", "Period_8", 30.0, 0.0, 0, NO) Period_9 = ("Period_9", SCALAR, "sec", "Period_9", 30.0, 0.0, 0, NO) +Period_10 = ("Period_10", SCALAR, "sec", "Period_10", 30.0, 0.0, 0, NO) #Fcst Grids - for partitioned wave groups Period1 = ("Period1", SCALAR, "sec", "Period1", 25.0, 0.0, 1, NO) @@ -251,6 +258,7 @@ Period6 = ("Period6", SCALAR, "sec", "Period6", 25.0, 0.0, 1, NO) Period7 = ("Period7", SCALAR, "sec", "Period7", 25.0, 0.0, 0, NO) Period8 = ("Period8", SCALAR, "sec", "Period8", 25.0, 0.0, 0, NO) Period9 = ("Period9", SCALAR, "sec", "Period9", 25.0, 0.0, 0, NO) +Period10 = ("Period10", SCALAR, "sec", "Period10", 25.0, 0.0, 0, NO) # Fire Weather Weather Elements LAL = ("LAL", SCALAR, "cat", "Lightning Activity Level", 6.0, 1.0, 0, NO) @@ -1973,7 +1981,7 @@ OFFICIALDBS = [([Temp, Td, Wind, NWPSwind, Weather, Sky, FzLevel, SnowLevel], TC ([MinT], MinTTC), ([MaxT], MaxTTC), ([MinRH], MinRHTC), ([MaxRH], MaxRHTC), ([WaveHeight, SurfHeight, Swell, Swell2, Period], TC3NG), - ([WindWaveHeight, SwanSwell, Wave1, Wave2, Wave3, Wave4, Wave5, Wave6, Wave7, Wave8, Wave9, Period1, Period2, Period3, Period4, Period5, Period6, Period7, Period8, Period9], TC3NG), + ([WindWaveHeight, SwanSwell, Wave1, Wave2, Wave3, Wave4, Wave5, Wave6, Wave7, Wave8, Wave9, Wave10, Period1, Period2, Period3, Period4, Period5, Period6, Period7, Period8, Period9, Period10], TC3NG), ([VentRate, LAL, Haines, MixHgt, FreeWind, TransWind], TC1), ([DSI, Stability, MarineLayer], TC1), ([HrsOfSun, InvBurnOffTemp], LT24), @@ -1998,7 +2006,7 @@ OFFICIALDBS = [([Temp, Td, Wind, NWPSwind, Weather, Sky, FzLevel, SnowLevel], TC # NWPS nwpsCG1_MODEL = [([SwanSwell, Period, WaveHeight, WindWaveHeight, Wind], TC3NG)] -nwpsTrkngCG0_MODEL = [([Wave1, Wave2, Wave3, Wave4, Wave5, Wave6, Wave7, Wave8, Wave9, Period1, Period2, Period3, Period4, Period5, Period6,Period7, Period8, Period9 ], TC3NG)] +nwpsTrkngCG0_MODEL = [([Wave1, Wave2, Wave3, Wave4, Wave5, Wave6, Wave7, Wave8, Wave9, Wave10, Period1, Period2, Period3, Period4, Period5, Period6,Period7, Period8, Period9, Period10 ], TC3NG)] # Global Wave Watch III, WNAWAVE, AKWAVE Model database parameter groupings WAVEPARMS = [([WindWaveHeight, WaveHeight, SurfHeight, Wind], TC6), diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/gfeLevelMappingFile.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/gfeLevelMappingFile.xml index cb9bf4d2e9..da3d38cf1e 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/gfeLevelMappingFile.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/gfeLevelMappingFile.xml @@ -420,6 +420,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/parameterInfo/nwpsTrkngCG0.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/parameterInfo/nwpsTrkngCG0.xml index 7d80f672c9..6f3c5c72ee 100755 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/parameterInfo/nwpsTrkngCG0.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/grid/parameterInfo/nwpsTrkngCG0.xml @@ -26,10 +26,15 @@ 237600 248400 259200 + 270000 280800 + 291600 302400 + 313200 324000 + 334800 345600 + 356400 367200 388800 410400 @@ -46,7 +51,7 @@ 648000 - SWDIR + swdir Swell peak direction degree_angle degree_angle @@ -70,7 +75,7 @@ - SWPER + swper Swell wave peak period s seconds @@ -94,7 +99,7 @@ - SWELL + swell Significant swell wave height m meters diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/nwpsTrkngCG0.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/nwpsTrkngCG0.py index 28c18783aa..7ebd623e8b 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/nwpsTrkngCG0.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/nwpsTrkngCG0.py @@ -4,78 +4,56 @@ import os class nwpsTrkngCG0Forecaster(Forecaster): def __init__(self): Forecaster.__init__(self, "nwpsTrkngCG0", "nwpsTrkngCG0") - - def calcPeriod1(self, SWPER_OSEQD1): - period = SWPER_OSEQD1 - return period - def calcPeriod2(self, SWPER_OSEQD2): - period = SWPER_OSEQD2 - return period - def calcPeriod3(self, SWPER_OSEQD3): - period = SWPER_OSEQD3 - return period - def calcPeriod4(self, SWPER_OSEQD4): - period = SWPER_OSEQD4 - return period - def calcPeriod5(self, SWPER_OSEQD5): - period = SWPER_OSEQD5 - return period - def calcPeriod6(self, SWPER_OSEQD6): - period = SWPER_OSEQD6 - return period - def calcPeriod7(self, SWPER_OSEQD7): - period = SWPER_OSEQD7 - return period - def calcPeriod8(self, SWPER_OSEQD8): - period = SWPER_OSEQD8 - return period - def calcPeriod9(self, SWPER_OSEQD9): - period = SWPER_OSEQD9 - return period - def calcPeriod10(self, SWPER_OSEQD10): - period = SWPER_OSEQD10 - return period - - def calcWave1(self, SWELL_OSEQD1, SWDIR_OSEQD1): - mag = SWELL_OSEQD1 * 3.28 - dir = clip(SWDIR_OSEQD1, 0, 359.5) + + def _calcPeriodN(self, swper): + return swper + + def _calcWaveN(self, swell, swdir): + mag = swell / 0.3048 + dir = clip(swdir, 0, 359.5) return (mag, dir) - def calcWave2(self, SWELL_OSEQD2, SWDIR_OSEQD2): - mag = SWELL_OSEQD2 * 3.28 - dir = clip(SWDIR_OSEQD2, 0, 359.5) - return (mag, dir) - def calcWave3(self, SWELL_OSEQD3, SWDIR_OSEQD3): - mag = SWELL_OSEQD3 * 3.28 - dir = clip(SWDIR_OSEQD3, 0, 359.5) - return (mag, dir) - def calcWave4(self, SWELL_OSEQD4, SWDIR_OSEQD4): - mag = SWELL_OSEQD4 * 3.28 - dir = clip(SWDIR_OSEQD4, 0, 359.5) - return (mag, dir) - def calcWave5(self, SWELL_OSEQD5, SWDIR_OSEQD5): - mag = SWELL_OSEQD5 * 3.28 - dir = clip(SWDIR_OSEQD5, 0, 359.5) - return (mag, dir) - def calcWave6(self, SWELL_OSEQD6, SWDIR_OSEQD6): - mag = SWELL_OSEQD6 * 3.28 - dir = clip(SWDIR_OSEQD6, 0, 359.5) - return (mag, dir) - def calcWave7(self, SWELL_OSEQD7, SWDIR_OSEQD7): - mag = SWELL_OSEQD7 * 3.28 - dir = clip(SWDIR_OSEQD7, 0, 359.5) - return (mag, dir) - def calcWave8(self, SWELL_OSEQD8, SWDIR_OSEQD8): - mag = SWELL_OSEQD8 * 3.28 - dir = clip(SWDIR_OSEQD8, 0, 359.5) - return (mag, dir) - def calcWave9(self, SWELL_OSEQD9, SWDIR_OSEQD9): - mag = SWELL_OSEQD9 * 3.28 - dir = clip(SWDIR_OSEQD9, 0, 359.5) - return (mag, dir) - def calcWave10(self, SWELL_OSEQD10, SWDIR_OSEQD10): - mag = SWELL_OSEQD10 * 3.28 - dir = clip(SWDIR_OSEQD10, 0, 359.5) - return (mag, dir) + + def calcPeriod1(self, swper_OSEQD1): + return self._calcPeriodN(swper_OSEQD1) + def calcPeriod2(self, swper_OSEQD2): + return self._calcPeriodN(swper_OSEQD2) + def calcPeriod3(self, swper_OSEQD3): + return self._calcPeriodN(swper_OSEQD3) + def calcPeriod4(self, swper_OSEQD4): + return self._calcPeriodN(swper_OSEQD4) + def calcPeriod5(self, swper_OSEQD5): + return self._calcPeriodN(swper_OSEQD5) + def calcPeriod6(self, swper_OSEQD6): + return self._calcPeriodN(swper_OSEQD6) + def calcPeriod7(self, swper_OSEQD7): + return self._calcPeriodN(swper_OSEQD7) + def calcPeriod8(self, swper_OSEQD8): + return self._calcPeriodN(swper_OSEQD8) + def calcPeriod9(self, swper_OSEQD9): + return self._calcPeriodN(swper_OSEQD9) + def calcPeriod10(self, swper_OSEQD10): + return self._calcPeriodN(swper_OSEQD10) + + def calcWave1(self, swell_OSEQD1, swdir_OSEQD1): + return self._calcWaveN(swell_OSEQD1, swdir_OSEQD1) + def calcWave2(self, swell_OSEQD2, swdir_OSEQD2): + return self._calcWaveN(swell_OSEQD2, swdir_OSEQD2) + def calcWave3(self, swell_OSEQD3, swdir_OSEQD3): + return self._calcWaveN(swell_OSEQD3, swdir_OSEQD3) + def calcWave4(self, swell_OSEQD4, swdir_OSEQD4): + return self._calcWaveN(swell_OSEQD4, swdir_OSEQD4) + def calcWave5(self, swell_OSEQD5, swdir_OSEQD5): + return self._calcWaveN(swell_OSEQD5, swdir_OSEQD5) + def calcWave6(self, swell_OSEQD6, swdir_OSEQD6): + return self._calcWaveN(swell_OSEQD6, swdir_OSEQD6) + def calcWave7(self, swell_OSEQD7, swdir_OSEQD7): + return self._calcWaveN(swell_OSEQD7, swdir_OSEQD7) + def calcWave8(self, swell_OSEQD8, swdir_OSEQD8): + return self._calcWaveN(swell_OSEQD8, swdir_OSEQD8) + def calcWave9(self, swell_OSEQD9, swdir_OSEQD9): + return self._calcWaveN(swell_OSEQD9, swdir_OSEQD9) + def calcWave10(self, swell_OSEQD10, swdir_OSEQD10): + return self._calcWaveN(swell_OSEQD10, swdir_OSEQD10) def main(): nwpsTrkngCG0Forecaster().run() diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF index 3679edde51..ac1ad974fd 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF @@ -14,4 +14,6 @@ Require-Bundle: com.raytheon.uf.common.dataplugin, com.raytheon.uf.common.geospatial, com.raytheon.uf.common.serialization, com.raytheon.uf.common.dataaccess, + com.raytheon.uf.common.message, javax.measure +Eclipse-RegisterBuddy: com.raytheon.uf.common.message diff --git a/edexOsgi/com.raytheon.uf.edex.dat.utils/src/com/raytheon/uf/edex/dat/utils/FreezingLevel.java b/edexOsgi/com.raytheon.uf.edex.dat.utils/src/com/raytheon/uf/edex/dat/utils/FreezingLevel.java index b4703b2e96..ffea0c9a02 100644 --- a/edexOsgi/com.raytheon.uf.edex.dat.utils/src/com/raytheon/uf/edex/dat/utils/FreezingLevel.java +++ b/edexOsgi/com.raytheon.uf.edex.dat.utils/src/com/raytheon/uf/edex/dat/utils/FreezingLevel.java @@ -43,6 +43,7 @@ import com.raytheon.uf.common.geospatial.ISpatialObject; import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.geospatial.PointUtil; import com.raytheon.uf.common.monitor.xml.SCANModelParameterXML; +import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.edex.database.plugin.PluginDao; import com.raytheon.uf.edex.database.plugin.PluginFactory; import com.raytheon.uf.edex.database.query.DatabaseQuery; @@ -106,6 +107,7 @@ public class FreezingLevel { // only for get data for hour 00z,06z,12z, or 18z int adjustedHour = (refTime.get(Calendar.HOUR_OF_DAY) / 6) * 6; refTime.set(Calendar.HOUR_OF_DAY, adjustedHour); + TimeUtil.minCalendarFields(refTime, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND); // populates what ever is missing, sets prevalent forecast hour for (Entry entry : getGHLevelMap().entrySet()) { diff --git a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/src/gov/nasa/msfc/sport/edex/plugin/lma/LmaDecoder.java b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/src/gov/nasa/msfc/sport/edex/plugin/lma/LmaDecoder.java index ddc3134c0a..170b9b4a13 100755 --- a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/src/gov/nasa/msfc/sport/edex/plugin/lma/LmaDecoder.java +++ b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/src/gov/nasa/msfc/sport/edex/plugin/lma/LmaDecoder.java @@ -64,7 +64,7 @@ public class LmaDecoder { */ public PluginDataObject[] decode(File fileInput) throws Exception { //Create an empty records to hold the data once decoded. - GridRecord[] records = null; + List recordsList = new ArrayList(); /** The variable dictionary used to check which variables are supported by the ingest **/ LMAVarsDict lmaVarsDict = LMAVarsDict.getInstance(); @@ -105,7 +105,6 @@ public class LmaDecoder { float dy= yresAtt.getNumericValue().floatValue(); int nx = file.findDimension("x").getLength(); int ny = file.findDimension("y").getLength(); - int nz = file.findDimension("levels_17").getLength(); //Construct the grid coverage with attributes GridCoverage cov =createMapCoverage(centerLon, centerLat, nx, ny, dx, dy); //Lookup Coverage to make sure it does not already exist in the db. @@ -129,17 +128,15 @@ public class LmaDecoder { String[] listOfVariablesToProcess = new String[sizeOfVariablesToProcess]; varsToProcessList.toArray(listOfVariablesToProcess); - // - //Create initial Grid Record array - int count =0; - records = new GridRecord[sizeOfVariablesToProcess*nz]; + //Iterate over variables and create GridRecords for each variable and level for (int i = 0; i0) { + GridRecord[] records = new GridRecord[recordsList.size()]; + recordsList.toArray(records); + return records; + } else { + return null; + } } diff --git a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_1.cmap b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_1.cmap new file mode 100644 index 0000000000..c543aad171 --- /dev/null +++ b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_1.cmap @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_2.cmap b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_2.cmap new file mode 100644 index 0000000000..6e67d83842 --- /dev/null +++ b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_2.cmap @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/lma/nalma.cmap b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_default.cmap similarity index 99% rename from edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/lma/nalma.cmap rename to edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_default.cmap index af7db68192..dd45f170a6 100644 --- a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/lma/nalma.cmap +++ b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/colormaps/LMA/LMA_default.cmap @@ -3,9 +3,9 @@ This is a colormap file that is read via JaXB to marshel the ColorMap class. ======================--> - - - + + + diff --git a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/menus/lma/lma.xml b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/menus/lma/lma.xml index 528f5ea94e..6b2e35ee45 100644 --- a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/menus/lma/lma.xml +++ b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/menus/lma/lma.xml @@ -9,7 +9,7 @@ - + /grid/NALMA/%/%/lmamsd @@ -17,7 +17,7 @@ - + /grid/NALMA/%/%/lmafed @@ -25,7 +25,7 @@ - + /grid/NALMA/%/%/lmafid @@ -33,7 +33,7 @@ - + /grid/NALMA/%/%/lmamfd @@ -41,7 +41,7 @@ - + /grid/NALMA/%/%/lmaroc @@ -49,7 +49,7 @@ - + @@ -59,7 +59,7 @@ - + /grid/DCLMA/%/%/lmafed @@ -67,7 +67,7 @@ - + /grid/DCLMA/%/%/lmafid @@ -75,7 +75,7 @@ - + /grid/DCLMA/%/%/lmamfd @@ -83,7 +83,7 @@ - + @@ -94,7 +94,7 @@ - + /grid/KLDAR/%/%/lmafed @@ -102,7 +102,7 @@ - + /grid/KLDAR/%/%/lmafid @@ -110,7 +110,7 @@ - + /grid/KLDAR/%/%/lmamfd @@ -118,7 +118,7 @@ - + @@ -129,7 +129,7 @@ - + /grid/OKLMA/%/%/lmafed @@ -137,7 +137,7 @@ - + /grid/OKLMA/%/%/lmafid @@ -145,7 +145,7 @@ - + /grid/OKLMA/%/%/lmamfd @@ -153,7 +153,7 @@ - + @@ -164,7 +164,7 @@ - + /grid/COLMA/%/%/lmafed @@ -172,7 +172,7 @@ - + /grid/COLMA/%/%/lmafid @@ -180,7 +180,7 @@ - + /grid/COLMA/%/%/lmamfd @@ -188,7 +188,7 @@ - + @@ -199,7 +199,7 @@ - + /grid/HGLMA/%/%/lmafed @@ -207,7 +207,7 @@ - + /grid/HGLMA/%/%/lmafid @@ -215,7 +215,7 @@ - + /grid/HGLMA/%/%/lmamfd @@ -223,7 +223,7 @@ - + @@ -234,7 +234,7 @@ - + /grid/WTLMA/%/%/lmafed @@ -242,7 +242,7 @@ - + /grid/WTLMA/%/%/lmafid @@ -250,7 +250,7 @@ - + /grid/WTLMA/%/%/lmamfd @@ -258,7 +258,7 @@ - + @@ -269,7 +269,7 @@ - + /grid/CFLMA/%/%/lmafed @@ -277,7 +277,7 @@ - + /grid/CFLMA/%/%/lmafid @@ -285,7 +285,7 @@ - + /grid/CFLMA/%/%/lmamfd @@ -293,7 +293,7 @@ - + @@ -304,7 +304,7 @@ - + /grid/LLLMA/%/%/lmafed @@ -312,7 +312,7 @@ - + /grid/LLLMA/%/%/lmafid @@ -320,7 +320,7 @@ - + /grid/LLLMA/%/%/lmamfd @@ -328,7 +328,7 @@ - + @@ -340,7 +340,7 @@ - + /grid/KSCLMA/%/%/lmafed @@ -348,7 +348,7 @@ - + /grid/KSCLMA/%/%/lmafid @@ -356,7 +356,7 @@ - + /grid/KSCLMA/%/%/lmamfd @@ -364,7 +364,7 @@ - + @@ -375,7 +375,7 @@ - + /grid/NGLMA/%/%/lmafed @@ -383,7 +383,7 @@ - + /grid/NGLMA/%/%/lmafid @@ -391,7 +391,7 @@ - + /grid/NGLMA/%/%/lmamfd @@ -399,7 +399,7 @@ - + @@ -410,7 +410,7 @@ - + /grid/ONLMA/%/%/lmafed @@ -418,7 +418,7 @@ - + /grid/ONLMA/%/%/lmafid @@ -426,7 +426,7 @@ - + /grid/ONLMA/%/%/lmamfd @@ -434,7 +434,7 @@ - + @@ -445,7 +445,7 @@ - + /grid/WILMA/%/%/lmafed @@ -453,7 +453,7 @@ - + /grid/WILMA/%/%/lmafid @@ -461,7 +461,7 @@ - + /grid/WILMA/%/%/lmamfd @@ -469,7 +469,7 @@ - + @@ -480,7 +480,7 @@ - + /grid/WSLMA/%/%/lmafed @@ -488,7 +488,7 @@ - + /grid/WSLMA/%/%/lmafid @@ -496,7 +496,7 @@ - + /grid/WSLMA/%/%/lmamfd @@ -504,7 +504,7 @@ - + @@ -517,7 +517,7 @@ - + /grid/PGNA/%/%/lmafid @@ -525,7 +525,7 @@ - + /grid/PGNA/%/%/lmamfd @@ -533,7 +533,7 @@ - + /grid/PGNA/%/%/lmasum @@ -541,7 +541,7 @@ - + @@ -552,7 +552,7 @@ - + /grid/PGDC/%/%/lmafid @@ -560,7 +560,7 @@ - + /grid/PGDC/%/%/lmamfd @@ -568,7 +568,7 @@ - + /grid/PGDC/%/%/lmasum @@ -576,7 +576,7 @@ - + @@ -587,7 +587,7 @@ - + /grid/PGSC/%/%/lmafid @@ -595,7 +595,7 @@ - + /grid/PGSC/%/%/lmamfd @@ -603,7 +603,7 @@ - + /grid/PGSC/%/%/lmasum @@ -611,7 +611,7 @@ - + @@ -622,7 +622,7 @@ - + /grid/PGOK/%/%/lmafid @@ -630,7 +630,7 @@ - + /grid/PGOK/%/%/lmamfd @@ -638,7 +638,7 @@ - + /grid/PGOK/%/%/lmasum @@ -646,7 +646,7 @@ - + @@ -657,7 +657,7 @@ - + /grid/PGCO/%/%/lmafid @@ -665,7 +665,7 @@ - + /grid/PGCO/%/%/lmamfd @@ -673,7 +673,7 @@ - + /grid/PGCO/%/%/lmasum @@ -681,7 +681,7 @@ - + @@ -692,7 +692,7 @@ - + /grid/PGHG/%/%/lmafid @@ -700,7 +700,7 @@ - + /grid/PGHG/%/%/lmamfd @@ -708,7 +708,7 @@ - + /grid/PGHG/%/%/lmasum @@ -716,7 +716,7 @@ - + @@ -727,7 +727,7 @@ - + /grid/PGWT/%/%/lmafid @@ -735,7 +735,7 @@ - + /grid/PGWT/%/%/lmamfd @@ -743,7 +743,7 @@ - + /grid/PGWT/%/%/lmasum @@ -751,7 +751,7 @@ - + @@ -762,7 +762,7 @@ - + /grid/PGCF/%/%/lmafid @@ -770,7 +770,7 @@ - + /grid/PGCF/%/%/lmamfd @@ -778,7 +778,7 @@ - + /grid/PGCF/%/%/lmasum @@ -786,7 +786,7 @@ - + @@ -797,7 +797,7 @@ - + /grid/PGLL/%/%/lmafid @@ -805,7 +805,7 @@ - + /grid/PGLL/%/%/lmamfd @@ -813,7 +813,7 @@ - + /grid/PGLL/%/%/lmasum @@ -821,7 +821,7 @@ - + diff --git a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/styleRules/lma/lmaImageryStyleRules.xml b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/styleRules/lma/lmaImageryStyleRules.xml index a205e89da4..f4b6c76f0d 100644 --- a/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/styleRules/lma/lmaImageryStyleRules.xml +++ b/edexOsgi/gov.nasa.msfc.sport.edex.plugin.lma/utility/common_static/base/styleRules/lma/lmaImageryStyleRules.xml @@ -8,7 +8,7 @@ 50.0 100.0 150.0 200.0 - lma/nalma + LMA/LMA_default 0.0 500.0 @@ -16,34 +16,18 @@ - - - lmamsd - - - - 50.0 100.0 150.0 - - lma/nalma - - 0.0 - 200.0 - - - lmafed lmafid lmamfd - lmasum 10.0 20.0 30.0 - lma/nalma + LMA/LMA_default 0.0 110.0 @@ -60,14 +44,28 @@ -1.0 0.0 1.0 - lma/nalma + LMA/LMA_default -3.0 3.0 - + + + lmasum + + + + 50.0 100.0 150.0 200.0 + + LMA/LMA_default + + 0.0 + 400.0 + + + diff --git a/javaUtilities/com.raytheon.wes2bridge.common/src/com/raytheon/wes2bridge/common/configuration/Wes2BridgeCase.java b/javaUtilities/com.raytheon.wes2bridge.common/src/com/raytheon/wes2bridge/common/configuration/Wes2BridgeCase.java index 460ad7a0ad..e0c13e475f 100644 --- a/javaUtilities/com.raytheon.wes2bridge.common/src/com/raytheon/wes2bridge/common/configuration/Wes2BridgeCase.java +++ b/javaUtilities/com.raytheon.wes2bridge.common/src/com/raytheon/wes2bridge/common/configuration/Wes2BridgeCase.java @@ -35,6 +35,7 @@ import javax.xml.bind.annotation.XmlRootElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Aug 12, 2014 3521 bkowal Initial creation + * Apr 20, 2015 4392 dlovely Removed un-used JMX port configuration * * * @@ -60,9 +61,6 @@ public class Wes2BridgeCase { @XmlElement private int qpidHttpPort; - @XmlElement - private int qpidJmxPort; - @XmlElement private int jmsPort; @@ -153,21 +151,6 @@ public class Wes2BridgeCase { this.qpidHttpPort = qpidHttpPort; } - /** - * @return the qpidJmxPort - */ - public int getQpidJmxPort() { - return qpidJmxPort; - } - - /** - * @param qpidJmxPort - * the qpidJmxPort to set - */ - public void setQpidJmxPort(int qpidJmxPort) { - this.qpidJmxPort = qpidJmxPort; - } - /** * @return the jmsPort */ diff --git a/javaUtilities/com.raytheon.wes2bridge.manager/META-INF/MANIFEST.MF b/javaUtilities/com.raytheon.wes2bridge.manager/META-INF/MANIFEST.MF index b2a3ee4147..41c95f3a62 100644 --- a/javaUtilities/com.raytheon.wes2bridge.manager/META-INF/MANIFEST.MF +++ b/javaUtilities/com.raytheon.wes2bridge.manager/META-INF/MANIFEST.MF @@ -4,6 +4,7 @@ Bundle-Name: Wes2Bridge Manager Bundle-SymbolicName: com.raytheon.wes2bridge.manager Bundle-Version: 1.0.0.qualifier Bundle-Vendor: RAYTHEON -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Require-Bundle: com.raytheon.wes2bridge.common;bundle-version="1.0.0", - org.apache.commons.lang;bundle-version="2.3.0" + org.apache.commons.lang;bundle-version="2.3.0", + org.codehaus.jackson;bundle-version="1.7.3" diff --git a/javaUtilities/com.raytheon.wes2bridge.manager/build.xml b/javaUtilities/com.raytheon.wes2bridge.manager/build.xml index e0ee4a8ab9..0a0d2eca93 100644 --- a/javaUtilities/com.raytheon.wes2bridge.manager/build.xml +++ b/javaUtilities/com.raytheon.wes2bridge.manager/build.xml @@ -11,7 +11,7 @@ - + @@ -36,6 +36,9 @@ + + + diff --git a/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/IQpidConfigurationXML.java b/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/IQpidConfigurationXML.java deleted file mode 100644 index bc036eeb47..0000000000 --- a/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/IQpidConfigurationXML.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * 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. - **/ -package com.raytheon.wes2bridge.manager; - -/** - * Identifies XML tag names of interest as constants within the qpid config.xml - * configuration. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Apr 17, 2013            bkowal     Initial creation
- * 
- * 
- * - * @author bkowal - * @version 1.0 - */ - -public interface IQpidConfigurationXML { - public static final String XML_BROKER = "broker"; - public static final String XML_CONNECTOR = "connector"; - public static final String XML_MANAGEMENT = "management"; - public static final String XML_JMXPORT = "jmxport"; - public static final String XML_HTTP = "http"; - public static final String XML_REGISTRY_SERVER = "registryServer"; - public static final String XML_PORT = "port"; -} diff --git a/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/Wes2BridgeManager.java b/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/Wes2BridgeManager.java index d837d1551f..a4088fc87f 100644 --- a/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/Wes2BridgeManager.java +++ b/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/Wes2BridgeManager.java @@ -26,27 +26,21 @@ import java.io.BufferedReader; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.regex.Pattern; import java.util.regex.Matcher; import javax.xml.bind.JAXBException; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; import org.apache.commons.lang.StringUtils; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; -import com.raytheon.wes2bridge.manager.IQpidConfigurationXML; import com.raytheon.wes2bridge.common.configuration.Wes2BridgeCase; import com.raytheon.wes2bridge.configuration.jaxb.Wes2BridgeJaxbManager; @@ -73,6 +67,8 @@ import com.raytheon.wes2bridge.configuration.jaxb.Wes2BridgeJaxbManager; * Aug 14, 2014 3521 bkowal Updated to use Wes2BridgeCase. Eliminated * configuration that is no longer used and * updated EDEX re-configuration. + * Apr 15, 2015 4392 dlovely Updates the new qpid json configuration now + * Apr 20, 2015 4392 dlovely Removed un-used JMX port configuration * * * @@ -101,6 +97,16 @@ public class Wes2BridgeManager { private String wes2BridgeScripts = null; + private static final TypeReference> MAP_TYPE_REFERENCE = new TypeReference>() + { + }; + + public static final String QPID_NAME = "name"; + public static final String QPID_AMQP = "AMQP"; + public static final String QPID_HTTP = "HTTP"; + public static final String QPID_PORT = "port"; + public static final String QPID_PORTS = "ports"; + /** * */ @@ -191,9 +197,9 @@ public class Wes2BridgeManager { final String line1 = "export DATA_ARCHIVE_ROOT="; final String line2 = "export DB_PORT="; - final String line3 = "export BROKER_ADDR="; + final String line3 = "export BROKER_PORT="; final String line4 = "export HTTP_PORT="; - final String line5 = "export JMS_SERVER="; + final String line5 = "export BROKER_HTTP="; final String line6 = "export SHARE_DIR="; final String pypiesServerPattern = "(export PYPIES_SERVER=http://.+:)[1-9][0-9]+"; final Pattern pattern7 = Pattern.compile(pypiesServerPattern); @@ -207,13 +213,11 @@ public class Wes2BridgeManager { } else if (line.startsWith(line2)) { line = line2 + this.wes2BridgeCase.getDatabasePort(); } else if (line.startsWith(line3)) { - line = line3 + "localhost:" - + this.wes2BridgeCase.getJmsPort(); + line = line3 + this.wes2BridgeCase.getJmsPort(); } else if (line.startsWith(line4)) { line = line4 + this.wes2BridgeCase.getEdexHttpPort(); } else if (line.startsWith(line5)) { - line = line5 + "tcp://localhost:" - + this.wes2BridgeCase.getJmsPort(); + line = line5 + this.wes2BridgeCase.getQpidHttpPort(); } else if (line.startsWith(line6)) { line = line6 + edexDirectory + "/data/share"; } else if (matcher.matches()) { @@ -409,87 +413,51 @@ public class Wes2BridgeManager { } } - public void reconfigureQPID() throws FileNotFoundException, IOException, - ParserConfigurationException, SAXException, - TransformerFactoryConfigurationError, TransformerException { + public void reconfigureQPID() throws FileNotFoundException, IOException { final String srcQpidDirectory = AWIPSII + "/" + "qpid"; final String qpidDirectory = WES2BRIDGE_DIRECTORY + "/" + this.wes2BridgeCase.getName() + "/" + "qpid"; - this.updateQpidConfigXML(srcQpidDirectory, qpidDirectory); + this.updateQpidConfigJSON(srcQpidDirectory, qpidDirectory); this.updateQPIDD(qpidDirectory); } - /* Updates qpid config.xml */ - private void updateQpidConfigXML(String srcQpidDirectory, - String qpidDirectory) throws FileNotFoundException, IOException, - ParserConfigurationException, SAXException, - TransformerFactoryConfigurationError, TransformerException { - String srcconfig_xml = srcQpidDirectory + "/etc/config.xml"; - String config_xml = qpidDirectory + "/etc/config.xml"; + /* Updates qpid config.json */ + private void updateQpidConfigJSON(String srcQpidDirectory, + String qpidDirectory) throws FileNotFoundException, IOException { + String srcconfig_json = srcQpidDirectory + "/config.json"; + String config_json = qpidDirectory + "/config.json"; - DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - Document document = documentBuilder.parse(srcconfig_xml); + try (BufferedWriter bw = this.getBufferedWriter(config_json);){ - // Get the root broker node. - Node brokerNode = document.getElementsByTagName( - IQpidConfigurationXML.XML_BROKER).item(0); - // Get the connector node. - Node connectorNode = this.getChildNodeByName(brokerNode, - IQpidConfigurationXML.XML_CONNECTOR); - // Get the management node. - Node managementNode = this.getChildNodeByName(brokerNode, - IQpidConfigurationXML.XML_MANAGEMENT); - // Get the jmxport node. - Node jmxPortNode = this.getChildNodeByName(managementNode, - IQpidConfigurationXML.XML_JMXPORT); - // Get the http port node. - Node httpPortNode = this.getChildNodeByName(managementNode, - IQpidConfigurationXML.XML_HTTP); - - Node portNode = null; - - // Get the connector port node. - portNode = this.getChildNodeByName(connectorNode, - IQpidConfigurationXML.XML_PORT); - portNode.setTextContent(Integer.toString(this.wes2BridgeCase - .getJmsPort())); - // Get the jmxport registryServer node - portNode = this.getChildNodeByName(jmxPortNode, - IQpidConfigurationXML.XML_REGISTRY_SERVER); - portNode.setTextContent(Integer.toString(this.wes2BridgeCase - .getQpidJmxPort())); - // Get the http port node. - portNode = this.getChildNodeByName(httpPortNode, - IQpidConfigurationXML.XML_PORT); - portNode.setTextContent(Integer.toString(this.wes2BridgeCase - .getQpidHttpPort())); - - /* - * Write the updated configuration file to its destination. - */ - Transformer transformer = TransformerFactory.newInstance() - .newTransformer(); - DOMSource domSource = new DOMSource(document); - StreamResult streamResult = new StreamResult(new File(config_xml)); - transformer.transform(domSource, streamResult); - } - - private Node getChildNodeByName(Node parentNode, String childName) { - if (parentNode.hasChildNodes() == false) { - return null; - } - - NodeList nodeList = parentNode.getChildNodes(); - for (int i = 0; i < nodeList.getLength(); i++) { - Node node = nodeList.item(i); - if (node.getNodeName().equals(childName)) { - return node; + List lines = Files.readAllLines(Paths.get(srcconfig_json), Charset.defaultCharset()); + StringBuilder stringBuilder = new StringBuilder(); + for (String line : lines) { + stringBuilder.append( line ); } - } - return null; + ObjectMapper mapper = new ObjectMapper(); + Map attributesMap = mapper.readValue(stringBuilder.toString(), MAP_TYPE_REFERENCE); + + @SuppressWarnings("unchecked") + ArrayList ports = (ArrayList) attributesMap.get(QPID_PORTS); + + for(int x = 0; x < ports.size(); x++) { + @SuppressWarnings("unchecked") + Map port = (Map) ports.get(x); + String name = (String) port.get(QPID_NAME); + if (QPID_AMQP.equals(name)) { + port.put(QPID_PORT, this.wes2BridgeCase.getJmsPort()); + } else if (QPID_HTTP.equals(name)) { + port.put(QPID_PORT, this.wes2BridgeCase.getQpidHttpPort()); + } + } + + /* + * Write the updated configuration file to its destination. + */ + mapper.defaultPrettyPrintingWriter().writeValue(bw, attributesMap); + } } private void updateQPIDD(String qpidDirectory) diff --git a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template index c28ea15b09..cc3584eb11 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -283,8 +283,11 @@ NGRID ^([LM].[EF].{1,3}) (KWBD) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([ # 2.5km CONUS GriddedLAMP # Pattern added by Josh Watson # The noaaportIngester does not yet read a grib2 SBN file with more than one message. -NGRID ^(L...[0-9][0-9]) (KMDL) (..)(..)(..) +# RM 17414 Split out EKDMOS from KMDL pattern +NGRID ^(L[ABCDKLMN]U[ABZ][0-9][0-9]) (KMDL) (..)(..)(..) FILE -overwrite -log -close -edex /data_store/grib2/(\3:yyyy)(\3:mm)\3/\4/LAMP/GRID184/\1_\2_\3\4\5_(seq).grib2.%Y%m%d%H +NGRID ^([LM][EFGH][A-L]Z9[0-9]) (KMDL) (..)(..)(..) + FILE -overwrite -log -close -edex /data_store/grib2/(\3:yyyy)(\3:mm)\3/\4/EKDMOS/GRID184/\1_\2_\3\4\5_(seq).grib2.%Y%m%d%H NGRID ^(L[CDEF]U.[0-9][0-9]) (KWNO) (..)(..)(..) FILE -overwrite -log -close -edex /data_store/grib2/(\3:yyyy)(\3:mm)\3/\4/LAMP/GRID184/\1_\2_\3\4\5_(seq).grib2.%Y%m%d%H @@ -358,26 +361,6 @@ NGRID ^(L.QA98) (KWBR) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([^/]*)/([0 ANY ^([LM].[EF].{1,3}) (KWBS) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([^/]*)/([0-9]{8})([0-9]{4})(F[0-9]{3})/([^/]*) FILE -overwrite -log -close -edex /data_store/\6/(\3:yyyy)(\3:mm)\3/\4/\7/GRID\8/\(10)Z_\(11)_\(12)-\1_\2_\3\4\5_(seq).\6.%Y%m%d%H -# AWIPS1: GRID ^LGXT[0-2][0-9].*KNHC /Grid/SBN/rawGrib2 -# *** This is only be available during an active storm. Verified 20120828 - Hurricane Isaac. - -ANY ^(LGXT[0-2][0-9]) KNHC (..)(..)(..) - FILE -overwrite -log -close -edex /data_store/grib2/(\2:yyyy)(\2:mm)\2/\3/TPC/\3\4Z_SURGE-\1_KNHC_\2\3\4_(seq).grib2.%Y%m%d%H - -# AWIPS1: GRID ^LGXP[0-9][0-9].*KNHC /Grid/SBN/rawGrib2 -# *** This is only be available during an active storm. Verified 20120828 - Hurricane Isaac. - -ANY ^(LGXP[0-9][0-9]) KNHC (..)(..)(..) - FILE -overwrite -log -close -edex /data_store/grib2/(\2:yyyy)(\2:mm)\2/\3/TPC/\3\4Z_SURGE-\1_KNHC_\2\3\4_(seq).grib2.%Y%m%d%H - -# TPCSurge PHISH heights -#ANY ^(L[l-X]X[QP][1-5]0) KNHC (..)(..)(..) -# FILE -overwrite -log -close -edex /data_store/grib2/(\2:yyyy)(\2:mm)\2/\3/TPC/\3\4Z_SURGE-\1_KNHC_\2\3\4_(seq).grib2.%Y%m%d%H - -# TPCSurge PHISH probabilities -#ANY ^(L[H-G]X[A-M][0-2][0-9]) KNHC (..)(..)(..) -# FILE -overwrite -log -close -edex /data_store/grib2/(\2:yyyy)(\2:mm)\2/\3/TPC/\3\4Z_SURGE-\1_KNHC_\2\3\4_(seq).grib2.%Y%m%d%H - # AWIPS1: GRID ^LDIZ11.*KWNS /Grid/SBN/rawGrib2 # LDIZ11 KWNS 180039 !grib2/ncep/0/#202/FHRS//LVL diff --git a/rpms/legal/Master_Rights_File.pdf b/rpms/legal/Master_Rights_File.pdf index 2a9dbe570e9b2a7de72d9640cc5a0dd11ee42a18..7741a9968efe40bdd50bfa38b8d4202e6d260a86 100644 GIT binary patch delta 15687 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