From 3254d34c04dac0ba22b5d33b20d6c94e20a6aac6 Mon Sep 17 00:00:00 2001 From: David Lovely Date: Mon, 13 Apr 2015 07:44:16 -0500 Subject: [PATCH 01/46] Omaha #4382 Removed use of reg.exe Former-commit-id: 7138fb04f19bd48cdcd23785f524a52db0e8fdd6 --- .../static/win32.amd64/alertviz/alertviz.bat | 25 +++---------------- cave/build/static/win32.amd64/cave/cave.bat | 25 +++---------------- 2 files changed, 8 insertions(+), 42 deletions(-) diff --git a/cave/build/static/win32.amd64/alertviz/alertviz.bat b/cave/build/static/win32.amd64/alertviz/alertviz.bat index 6798716f96..92eabfda45 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..55119721b6 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% From b0faa6d57f95dbd11a87c63f98ffac44d86c4e26 Mon Sep 17 00:00:00 2001 From: Steve Harris Date: Wed, 15 Apr 2015 09:15:11 -0500 Subject: [PATCH 02/46] Omaha #3299 - Added ldm-6.12.9 to open source credits Former-commit-id: 2555771c8694cdcbe208362538444ec514e5d518 --- rpms/legal/Master_Rights_File.pdf | Bin 157121 -> 157203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) 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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 From 9f488920a120fcb4b75ddc4b0ef2c127cf97543a Mon Sep 17 00:00:00 2001 From: David Lovely Date: Thu, 16 Apr 2015 09:03:21 -0500 Subject: [PATCH 03/46] Omaha #4392 Updates to configure new QPID json file. Former-commit-id: ef2c2f94c7dc30fb0313ce8df295c52ea3c22e85 --- .../META-INF/MANIFEST.MF | 5 +- .../com.raytheon.wes2bridge.manager/build.xml | 5 +- .../manager/IQpidConfigurationXML.java | 48 ------ .../wes2bridge/manager/Wes2BridgeManager.java | 140 +++++++----------- 4 files changed, 64 insertions(+), 134 deletions(-) delete mode 100644 javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/IQpidConfigurationXML.java 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..1848654a15 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,17 @@ import java.io.BufferedReader; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; +import java.util.ArrayList; +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 +63,7 @@ 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 * * * @@ -101,6 +92,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"; + /** * */ @@ -409,87 +410,60 @@ 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); + ObjectMapper mapper = new ObjectMapper(); - // 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); + BufferedReader br = null; + BufferedWriter bw = null; + try { + br = this.getBufferedReader(srcconfig_json); + bw = this.getBufferedWriter(config_json); - 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; + String line = StringUtils.EMPTY; + StringBuilder stringBuilder = new StringBuilder(); + while( ( line = br.readLine() ) != null ) { + stringBuilder.append( line ); } - } - return null; + 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.getQpidJmxPort()); + } 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); + + } finally { + br.close(); + bw.close(); + } } private void updateQPIDD(String qpidDirectory) From c9337caeb220d99fcca736adb0571fddd77c1d87 Mon Sep 17 00:00:00 2001 From: "Rici.Yu" Date: Thu, 16 Apr 2015 10:37:02 -0400 Subject: [PATCH 04/46] ASM #17390 - Fix string/int conversion issue preventing BOIVerify from launching Change-Id: I6c0a0ea22650a5b42b24b41e41e3ca0acabbf14b Former-commit-id: c6888b4aa86ed3425b5a016d2fbe5664763b4682 --- .../gfe/userPython/procedures/BOIVerify.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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)) From dd5fd66fa5808698b235ecdc6dc215164be79725 Mon Sep 17 00:00:00 2001 From: "Yun.Teng" Date: Thu, 16 Apr 2015 17:57:45 +0100 Subject: [PATCH 05/46] ASM #17383 - Fixed error that time constraint being off Change-Id: I7b00a4b0d1bd7822cd3f751264badfa62afc3bcb Former-commit-id: d0e8d057f765d95c65ef121e784152d05bd1187c --- .../utility/edex_static/base/config/gfe/serverConfig.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 01c0f01b6e..9371ad7da6 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 @@ -48,6 +48,8 @@ # 01/08/2015 #15035 lshi add site WNJ # 12/03/2014 #3866 rferrel Added GFS20 # 03/30/2015 #17206 yteng Changed some parameters that are not rate parameters +# 04/15/2015 #17383 yteng Change localTC to fix error that time constraints +# being off ######################################################################## #---------------------------------------------------------------------------- @@ -978,8 +980,8 @@ def localTC(start,repeat,duration,dst): timezone = SITES[GFESUITE_SITEID][3] import dateutil.tz, datetime tz = dateutil.tz.gettz(timezone) - dt = datetime.datetime.utcnow() - delta = tz.utcoffset(dt) + tz.dst(dt) + local = datetime.datetime.now(tz) + delta = tz.utcoffset(local) - tz.dst(local) offset = delta.days*86400 + delta.seconds start = start - offset if dst == 1: From 03034f57c8bb0ee566679206a81524b2ffc60755 Mon Sep 17 00:00:00 2001 From: "Rici.Yu" Date: Thu, 16 Apr 2015 13:24:29 -0400 Subject: [PATCH 06/46] ASM #14946 - fix issue when timezone is not defined for any zone in a segment Change-Id: I252f78cb9f5bf1cf556788c79fe14ad338b546aa Former-commit-id: ef4c5307d5693abd834f4210e081fb8e3a21f90b --- .../textUtilities/headline/FormatterRunner.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) 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 4d4b3f22d8..e87d3503f4 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,7 +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. # # @@ -440,19 +441,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): From 59d0c55202021a91a8facbb24b19d4fce66dd192 Mon Sep 17 00:00:00 2001 From: "Sean.Webb" Date: Mon, 20 Apr 2015 11:36:04 -0400 Subject: [PATCH 07/46] ASM #17398 - Removed tropical patterns from baseline Change-Id: I95bbf55d0306d5478c4decd20bc06677b4af9c57 Former-commit-id: 869e804dcdf4cbd00314eec063a134ca0d53f443 --- .../patch/etc/pqact.conf.template | 20 ------------------- 1 file changed, 20 deletions(-) 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 5c8b333e94..b5498422a2 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -315,26 +315,6 @@ NGRID ^(L.QA98) (KWBR) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/]*)/#([^/]*)/([0 ANY ^([LM].[ABCDEF].{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 From 41a03c3a1d64b64f89df583e6f89356ec5a6af06 Mon Sep 17 00:00:00 2001 From: David Lovely Date: Mon, 20 Apr 2015 13:46:01 -0500 Subject: [PATCH 08/46] Omaha #4392 Removed un-used JMX port configuration Former-commit-id: f119953ea5cdecdf853301cd0b253ce734244942 --- .../common/configuration/Wes2BridgeCase.java | 19 +-------------- .../wes2bridge/manager/Wes2BridgeManager.java | 24 ++++++++----------- 2 files changed, 11 insertions(+), 32 deletions(-) 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/src/com/raytheon/wes2bridge/manager/Wes2BridgeManager.java b/javaUtilities/com.raytheon.wes2bridge.manager/src/com/raytheon/wes2bridge/manager/Wes2BridgeManager.java index 1848654a15..0f2bc1a932 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,7 +26,11 @@ 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; @@ -64,6 +68,7 @@ import com.raytheon.wes2bridge.configuration.jaxb.Wes2BridgeJaxbManager; * 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 * * * @@ -425,20 +430,15 @@ public class Wes2BridgeManager { String srcconfig_json = srcQpidDirectory + "/config.json"; String config_json = qpidDirectory + "/config.json"; - ObjectMapper mapper = new ObjectMapper(); + try (BufferedWriter bw = this.getBufferedWriter(config_json);){ - BufferedReader br = null; - BufferedWriter bw = null; - try { - br = this.getBufferedReader(srcconfig_json); - bw = this.getBufferedWriter(config_json); - - String line = StringUtils.EMPTY; + List lines = Files.readAllLines(Paths.get(srcconfig_json), Charset.defaultCharset()); StringBuilder stringBuilder = new StringBuilder(); - while( ( line = br.readLine() ) != null ) { + for (String line : lines) { stringBuilder.append( line ); } + ObjectMapper mapper = new ObjectMapper(); Map attributesMap = mapper.readValue(stringBuilder.toString(), MAP_TYPE_REFERENCE); @SuppressWarnings("unchecked") @@ -449,7 +449,7 @@ public class Wes2BridgeManager { Map port = (Map) ports.get(x); String name = (String) port.get(QPID_NAME); if (QPID_AMQP.equals(name)) { - port.put(QPID_PORT, this.wes2BridgeCase.getQpidJmxPort()); + port.put(QPID_PORT, this.wes2BridgeCase.getJmsPort()); } else if (QPID_HTTP.equals(name)) { port.put(QPID_PORT, this.wes2BridgeCase.getQpidHttpPort()); } @@ -459,10 +459,6 @@ public class Wes2BridgeManager { * Write the updated configuration file to its destination. */ mapper.defaultPrettyPrintingWriter().writeValue(bw, attributesMap); - - } finally { - br.close(); - bw.close(); } } From 740938ee59243ea6cd4e29e132f7c0e5ebcda2dc Mon Sep 17 00:00:00 2001 From: David Gillingham Date: Mon, 20 Apr 2015 12:06:27 -0500 Subject: [PATCH 09/46] Omaha #4414: Fix display of nwpsTrkngCG0 D2D and smart init data for GFE. Change-Id: I466dd123c9a438b8c0d012c66a1ed1af042964fb Former-commit-id: 467a37cb5da18eafb8c5aa1fe0a3851cf10ff0be --- .../base/config/gfe/serverConfig.py | 12 +- .../base/grid/gfeLevelMappingFile.xml | 24 ++++ .../base/grid/parameterInfo/nwpsTrkngCG0.xml | 11 +- .../base/smartinit/nwpsTrkngCG0.py | 120 +++++++----------- 4 files changed, 90 insertions(+), 77 deletions(-) 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 7b564651b1..9e1e159ae6 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 @@ -51,7 +51,9 @@ # 04/03/2015 #4367 dgilling Change WindGust's time constraints back to TC1 # 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. +# ######################################################################## #---------------------------------------------------------------------------- @@ -208,6 +210,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) @@ -219,6 +222,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) @@ -230,6 +234,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) @@ -241,6 +246,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) @@ -1941,7 +1947,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), @@ -1966,7 +1972,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() From f2a6c66c505ebe92628b167db19604ed5f056636 Mon Sep 17 00:00:00 2001 From: David Lovely Date: Wed, 22 Apr 2015 09:35:40 -0500 Subject: [PATCH 10/46] Omaha #4392 Fixed broker address substitution Change-Id: Ib7ea0577e8d020ad2d94aa7ddbaa08459c9fa433 Former-commit-id: 6043b5052225fee426940fa8f32f54d8a265fba2 --- edexOsgi/build.edex/esb/bin/setup.env | 6 ++++-- edexOsgi/build.edex/esb/conf/spring/edex.xml | 2 +- .../raytheon/wes2bridge/manager/Wes2BridgeManager.java | 10 ++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/edexOsgi/build.edex/esb/bin/setup.env b/edexOsgi/build.edex/esb/bin/setup.env index 3d76c08938..a3f3e4c5f1 100644 --- a/edexOsgi/build.edex/esb/bin/setup.env +++ b/edexOsgi/build.edex/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/edexOsgi/build.edex/esb/conf/spring/edex.xml b/edexOsgi/build.edex/esb/conf/spring/edex.xml index 1ab4339a3d..28e52c27c7 100644 --- a/edexOsgi/build.edex/esb/conf/spring/edex.xml +++ b/edexOsgi/build.edex/esb/conf/spring/edex.xml @@ -14,7 +14,7 @@ - + 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 0f2bc1a932..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 @@ -197,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); @@ -213,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()) { From 812dcfba57bc147d565ffb732a3b4b95b8891066 Mon Sep 17 00:00:00 2001 From: David Lovely Date: Thu, 23 Apr 2015 10:07:42 -0500 Subject: [PATCH 11/46] Omaha #4382 Removed quotes from batch files Former-commit-id: 9d8c4774d1834205ad825a27fef10e8ec6a48334 --- cave/build/static/win32.amd64/alertviz/alertviz.bat | 4 ++-- cave/build/static/win32.amd64/cave/cave.bat | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cave/build/static/win32.amd64/alertviz/alertviz.bat b/cave/build/static/win32.amd64/alertviz/alertviz.bat index 92eabfda45..b6b641bab0 100644 --- a/cave/build/static/win32.amd64/alertviz/alertviz.bat +++ b/cave/build/static/win32.amd64/alertviz/alertviz.bat @@ -6,9 +6,9 @@ SET CONTAINING_DIRECTORY=%~dp0 REM Prepare the environment. REM Location of AWIPS II Java (the jre). -SET JavaJreDirectory="C:\Program Files\Raytheon\AWIPS II\Java\jre7" +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" +SET PythonInstallDirectory=C:\Program Files\Raytheon\AWIPS II\Python REM Add Java and Python to the path. SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% diff --git a/cave/build/static/win32.amd64/cave/cave.bat b/cave/build/static/win32.amd64/cave/cave.bat index 55119721b6..a343b81be7 100644 --- a/cave/build/static/win32.amd64/cave/cave.bat +++ b/cave/build/static/win32.amd64/cave/cave.bat @@ -6,9 +6,9 @@ SET CONTAINING_DIRECTORY=%~dp0 REM Prepare the environment. REM Location of AWIPS II Java (the jre). -SET JavaJreDirectory="C:\Program Files\Raytheon\AWIPS II\Java\jre7" +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" +SET PythonInstallDirectory=C:\Program Files\Raytheon\AWIPS II\Python REM Add Java and Python to the path. SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% From eba4333d02bb292adf0d71381af468669a6ec5dc Mon Sep 17 00:00:00 2001 From: Jason Burks Date: Thu, 23 Apr 2015 10:53:53 -0500 Subject: [PATCH 12/46] VLab Issue #7704 - Fixed problem with LMADecoder decoding single level files. Added optional colormaps that would be useful for some users; Changed scaling on few parameters in image style rules; fixes #7704 Change-Id: If8599b7bf64c788063aa63e3bfc07c84a55654fd Former-commit-id: d747cb5700e68997f6b7b579d9d8f9d9698fbd8a --- .../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 ++- 6 files changed, 656 insertions(+), 136 deletions(-) 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%) 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 + + + From 18ceef2aadedaf31152ba0c492d378ff12393dcd Mon Sep 17 00:00:00 2001 From: "Sean.Webb" Date: Fri, 24 Apr 2015 14:12:02 -0400 Subject: [PATCH 13/46] ASM #17414 - EKDMOS pqact pattern changes Change-Id: Ic2ac59f79fd53ef244ab0a40cfb30c40ceb575c3 Former-commit-id: 262fd6e27cb512137a2576e58d9813ca90b1e90b --- rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 879917b16f..d00b740284 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -282,8 +282,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 From 309b751381da57008f49e07277446d60e75f275c Mon Sep 17 00:00:00 2001 From: "Rici.Yu" Date: Fri, 24 Apr 2015 15:35:56 -0400 Subject: [PATCH 14/46] ASM #17194 - add delta script to create/delete non-base files Change-Id: Ic3dabdf70715b1b385b4cbc31aad805b937a4ba6 Former-commit-id: ea060273f714503a80f43ad2310a6b882cb8ab11 --- .../DR17194/convertSerpConfigToUtility.py | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 deltaScripts/14.3.3/DR17194/convertSerpConfigToUtility.py 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() From 43049e62c7100cfd4545b4e530204e80024d61db Mon Sep 17 00:00:00 2001 From: "Fay.Liang" Date: Sat, 25 Apr 2015 19:58:59 -0400 Subject: [PATCH 15/46] ASM #17424 - Fix missing data in MPE Change-Id: Iab479a5ad9d6187363b6c097360ebc563bf9fd4b Former-commit-id: 45bdcaf1d1f41ef064cf4a6a95eab1655d68b3e9 --- .../src/com/raytheon/uf/edex/dat/utils/FreezingLevel.java | 2 ++ 1 file changed, 2 insertions(+) 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()) { From 8dc8977ab6da00fcf980f21fcad18fc235cfcbf7 Mon Sep 17 00:00:00 2001 From: "Qinglu.Lin" Date: Tue, 28 Apr 2015 10:36:19 -0400 Subject: [PATCH 16/46] ASM #17359 - Warngen: it takes long time to get warning areas hatched when switching from Marine Weather Statement to Special Marine Warning Change-Id: I02d432e4d335069a15700c9dc564bd19dbd14527 Former-commit-id: 3820522a7b6adb79f9eca4e75f66f93779ef7698 --- .../viz/warngen/gui/WarngenDialog.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java index 7d6aab1662..1dc47d40da 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenDialog.java @@ -159,6 +159,10 @@ import com.vividsolutions.jts.geom.Polygon; * Jul 01, 2014 DR 17450 D. Friedman Use list of templates from backup site. * Jul 21, 2014 3419 jsanchez Created a hidden button to make recreating polygons easier. * Feb 26, 2015 3353 rjpeter Fixed NPE on clear. + * Apr 27, 2015 DR 17359 Qinglu Lin Updated changeTemplate(). The approach for solving slowness issue while switching from + * one marine product to another is to skip computing hatching area. The hatching area might + * not be as expected if percentage/area is different between the two products. But the + * chance for that to occur is trivial. * * * @author chammack @@ -1657,14 +1661,17 @@ public class WarngenDialog extends CaveSWTDialog implements .equalsIgnoreCase(lastAreaSource); boolean snapHatchedAreaToPolygon = isDifferentAreaSources; boolean preservedSelection = !isDifferentAreaSources; - // If template has a different hatched area source from the previous - // template, then the warned area would be based on the polygon and not - // preserved. - try { - warngenLayer.updateWarnedAreas(snapHatchedAreaToPolygon, - preservedSelection); - } catch (VizException e1) { - statusHandler.handle(Priority.PROBLEM, "WarnGen Error", e1); + if (isDifferentAreaSources || !warngenLayer.getConfiguration() + .getHatchedAreaSource().getAreaSource().toLowerCase().equals("marinezones")) { + // If template has a different hatched area source from the previous + // template, then the warned area would be based on the polygon and not + // preserved. + try { + warngenLayer.updateWarnedAreas(snapHatchedAreaToPolygon, + preservedSelection); + } catch (VizException e1) { + statusHandler.handle(Priority.PROBLEM, "WarnGen Error", e1); + } } // Properly sets the "Create Text" button. setInstructions(); From 261da4895a8aa1e7c0847400d4e758a3bfb9fe7d Mon Sep 17 00:00:00 2001 From: David Friedman Date: Tue, 28 Apr 2015 16:25:25 +0000 Subject: [PATCH 17/46] ASM #15008 - Local and regional warnings may not display when overlaid on other products Change-Id: I2e43dbbd7389b80bc04020ad17ad935a26bd2b0a Former-commit-id: e036f27f76ed8a77cf65e57f1d29835b9702936d --- .../com/raytheon/viz/warnings/rsc/WarningsResource.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WarningsResource.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WarningsResource.java index f3bfa3e899..9094497fc5 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WarningsResource.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/rsc/WarningsResource.java @@ -68,6 +68,7 @@ import com.vividsolutions.jts.geom.Geometry; * Mar 04, 2014 2832 njensen Moved disposeInternal() to abstract class * Apr 07, 2014 2959 njensen Correct handling of color change * Apr 14, 2014 DR 17257 D. Friedman Redo time matching on per-minute refresh. + * Apr 28, 2015 ASM #15008 D. Friedman Create polygon for EXTs even if original product is not found. * * * @@ -268,9 +269,11 @@ public class WarningsResource extends AbstractWWAResource { } } } - // create the new polygon for the CON outside of the above - // for loop - if (createShape != null) { + /* Create a new polygon for the follow-up to the original + * product found in the above loop. Also create a polygon + * for EXT actions even if the original was not found. + */ + if (createShape != null || act == WarningAction.EXT) { initShape(target, warnrec); } } else { From 7c66a2a3563e163b6c67c0742474bc64e32a249a Mon Sep 17 00:00:00 2001 From: "Rici.Yu" Date: Tue, 28 Apr 2015 16:21:43 -0400 Subject: [PATCH 18/46] ASM #17435 - Fix hibernate query syntax issue Change-Id: I2bfd5e927fe97c3348d7366320dc535b6e67f590 Former-commit-id: 4c70c322956fa4a356e06e908a43b80611ae273f --- .../src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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(); From 4a50b7bfbf6c3d6becacae8f0fceedffaefd32d2 Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Wed, 29 Apr 2015 14:04:06 -0400 Subject: [PATCH 19/46] ASM #17430 - Update Manifest file Change-Id: I576bbbdca03198b671efa07b320ed2a652c31f5f Former-commit-id: 2a5e22aa3703a7a205ca39bcaf5075f5169ad3b0 --- .../com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF | 1 + 1 file changed, 1 insertion(+) 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..618464e6eb 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 @@ -15,3 +15,4 @@ Require-Bundle: com.raytheon.uf.common.dataplugin, com.raytheon.uf.common.serialization, com.raytheon.uf.common.dataaccess, javax.measure +Eclipse-RegisterBuddy: com.raytheon.uf.common.message From 1d7e10ce6776f5b76394ef75a9f2c3a4a1808721 Mon Sep 17 00:00:00 2001 From: "Ying-Lian.Shi" Date: Wed, 29 Apr 2015 21:33:45 +0000 Subject: [PATCH 20/46] ASM #17430 manifest add bundle com.ratheon.uf.common Change-Id: I0df50f0652436dbff4762ea8ae318b9071ad322d Former-commit-id: 6a6c45ce0da6ee5305e127efe57342a687d36821 --- .../com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF | 1 + 1 file changed, 1 insertion(+) 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 618464e6eb..21296e0c85 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,5 +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 From 4d729eee7d9353bdbba18659a77000c9c0f7c0b8 Mon Sep 17 00:00:00 2001 From: David Friedman Date: Wed, 29 Apr 2015 22:31:03 +0000 Subject: [PATCH 21/46] ASM #17310 - WarnGen: a large portion of hatched area was not included in polygon Change-Id: I4c6a98813149c01e6c878cc880f5e619937273dc Former-commit-id: addc3cc1bfedd9c36e41319ca528b9dadceff390 --- .../raytheon/viz/warngen/gis/PolygonUtil.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java index 9943db6592..edb6cce44f 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java @@ -54,6 +54,7 @@ import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.PrecisionModel; +import com.vividsolutions.jts.geom.TopologyException; import com.vividsolutions.jts.geom.prep.PreparedGeometry; import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; import com.vividsolutions.jts.precision.SimpleGeometryPrecisionReducer; @@ -89,6 +90,7 @@ import com.vividsolutions.jts.precision.SimpleGeometryPrecisionReducer; * 06/27/2014 DR 17443 D. Friedman Fix some odd cases in which parts of a polygon not covering a * hatched area would be retained after redrawing. * 07/22/2014 DR 17475 Qinglu Lin Updated createPolygonByPoints() and created second createPolygonByPoints(). + * 07/29/2015 DR 17310 D. Friedman Use Geometry.buffer() to fix self-intersections. Fix bug in alterVertexes. * * * @author mschenke @@ -547,6 +549,19 @@ public class PolygonUtil { Polygon rval = gf.createPolygon(gf.createLinearRing(points .toArray(new Coordinate[points.size()])), null); + if (!rval.isValid()) { + System.out.format("Polygon %s is invalid. Attempting to fix...\n", rval); + try { + Polygon p2 = (Polygon) rval.buffer(0.0); + rval = gf.createPolygon((LinearRing) p2.getExteriorRing()); + } catch (TopologyException e) { + System.out.format("...fix failed\n"); + } catch (ClassCastException e) { + System.out.format("...resulted in something other than a polygon\n"); + } + System.out.format("...fixed. Result: %s\n", rval); + } + if (rval.isValid() == false) { System.out.println("Fixing intersected segments"); Coordinate[] coords = rval.getCoordinates(); @@ -1675,8 +1690,8 @@ public class PolygonUtil { if (intersectCoord != null) { index1 = calcShortestDistance(intersectCoord, ls1); index2 = calcShortestDistance(intersectCoord, ls2); - Coordinate c = new Coordinate(0.5*(coord[index1].x + coord[2+index2].x), - 0.5*(coord[index1].y + coord[2+index2].y)); + Coordinate c = new Coordinate(0.5*(coord[index[index1]].x + coord[index[2+index2]].x), + 0.5*(coord[index[index1]].y + coord[index[2+index2]].y)); PolygonUtil.round(c, 2); coord[index[index1]] = new Coordinate(c); coord[index[2+index2]] = new Coordinate(c); From 57a5d0e226f9540448b9ebb67be337fff75c2d38 Mon Sep 17 00:00:00 2001 From: "Fay.Liang" Date: Wed, 29 Apr 2015 20:08:06 -0400 Subject: [PATCH 22/46] ASM #17430 - Update manifest file to fix cave initialization issue Change-Id: Ic40427809b60f926456195988bfd5fa1cc8f7ce9 Former-commit-id: 491d3787118242762a756bcd9f913c59da13853d --- .../com.raytheon.uf.common.dataplugin.obs/META-INF/MANIFEST.MF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 21296e0c85..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,6 +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 + com.raytheon.uf.common.message, javax.measure Eclipse-RegisterBuddy: com.raytheon.uf.common.message From 662f40ababf91487c678d57d1ecc2662f74a1631 Mon Sep 17 00:00:00 2001 From: "Rici.Yu" Date: Fri, 1 May 2015 11:11:27 -0400 Subject: [PATCH 23/46] ASM #17421 - Fix missing storm total snow phrase issue Change-Id: I231808bc7a9c8762efd2bf70dbc5a1e9dbb9d5e5 Former-commit-id: c3e17145980c3ce036862691ef22d6347e6bbbb1 --- .../textproducts/templates/product/AreaFcst.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py index 55b3dd5eac..fe09bc7ab2 100755 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/textproducts/templates/product/AreaFcst.py @@ -17,6 +17,14 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## +# +# SOFTWARE HISTORY +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# May 01, 2015 17421 ryu Changed analysis methods for StormTotalSnow +# +## + #------------------------------------------------------------------------- # Description: This product creates a ZFP-type series of text phrases # for consecutive time periods for a list of edit areas. It can be @@ -475,7 +483,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ("PoP", self._PoP_analysisMethod("Period_1"), [3]), ("PoP", self.binnedPercent, [3]), ("SnowAmt", self.accumMinMax), - ("StormTotalSnow", self.accumMinMax), + ("StormTotalSnow", self.minMax), ("IceAccum", self.accumMinMax), ("SnowLevel", self.avg), ("Wind", self.vectorMedianRange, [6]), @@ -564,7 +572,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ("PoP", self._PoP_analysisMethod("Period_2_3"), [6]), ("PoP", self.binnedPercent, [6]), ("SnowAmt", self.accumMinMax), - ("StormTotalSnow", self.accumMinMax), + ("StormTotalSnow", self.minMax), ("IceAccum", self.accumMinMax), ("SnowLevel", self.avg), ("Wind", self.vectorMedianRange, [6]), @@ -791,7 +799,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ("PoP", self._PoP_analysisMethod("FirstFcstPeriod"), [6]), ("PoP", self.binnedPercent, [6]), ("SnowAmt", self.accumMinMax), - ("StormTotalSnow", self.accumMinMax), + ("StormTotalSnow", self.minMax), ("IceAccum", self.accumMinMax), ("SnowLevel", self.avg), ("Wind", self.vectorMedianRange, [6]), @@ -852,7 +860,7 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis): ("PoP", self._PoP_analysisMethod("AreaFcstPeriod"), [6]), ("PoP", self.binnedPercent, [6]), ("SnowAmt", self.accumMinMax), - ("StormTotalSnow", self.accumMinMax), + ("StormTotalSnow", self.minMax), ("IceAccum", self.accumMinMax), ("SnowLevel", self.avg), ("Wind", self.vectorMedianRange, [6]), From 48e06c41ad9871148aee634d7a9a289f627566cf Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Fri, 1 May 2015 16:12:48 -0400 Subject: [PATCH 24/46] 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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 From 83906db315e7ec0eb90630c4b8e141b7a3d0ea4e Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Mon, 4 May 2015 10:53:21 -0400 Subject: [PATCH 25/46] ASM #17024 - Moved ndmMenuIngester.sh to build/deploy.edex.awips2/esb/bin/ Change-Id: I13f0db113db1582c57c6f2a42a5b2903a118530b Former-commit-id: 209589704fecd76aae472171ef6266eab39cefbb --- .../deploy.edex.awips2}/esb/bin/ndmMenuIngester.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {edexOsgi/build.edex => build/deploy.edex.awips2}/esb/bin/ndmMenuIngester.sh (100%) diff --git a/edexOsgi/build.edex/esb/bin/ndmMenuIngester.sh b/build/deploy.edex.awips2/esb/bin/ndmMenuIngester.sh similarity index 100% rename from edexOsgi/build.edex/esb/bin/ndmMenuIngester.sh rename to build/deploy.edex.awips2/esb/bin/ndmMenuIngester.sh From b605ae0bcde0007093f436b367aea19947919c69 Mon Sep 17 00:00:00 2001 From: "Yun.Teng" Date: Mon, 4 May 2015 18:23:34 +0100 Subject: [PATCH 26/46] ASM #17417 - AvnFPS retrieve multiple sites from configuration file Change-Id: I0edf02ac1ae06a4a4d4ce926390cc7d003acba3c Former-commit-id: 5c59562cb0fcfe0b1669cf5f19bb4a320e0f199b --- .../raytheon/viz/avnconfig/TafSiteConfigIni.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigIni.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigIni.java index 9e41793774..e1dd58b42d 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigIni.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigIni.java @@ -65,7 +65,8 @@ import com.raytheon.viz.avnconfig.AvnConfigConstants.triggerType; * Feb 16, 2011 7878 rferrel Modifications to use ids.cfg file. * Apr 08, 2011 8856 rferrel Can now make a new station's templates * May 24, 2011 9060 rferrel Limit downloading of localization files. - * Aug 09, 2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR + * Aug 09, 2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR + * May 04, 2015 17417 yteng Get all sites from product * * * @@ -299,13 +300,10 @@ public class TafSiteConfigIni implements ITafSiteConfig { HierarchicalINIConfiguration config = getProductConfig(product); if (config != null) { config.setDelimiterParsingDisabled(true); - String sites = config.getString("sites.idents"); - if (sites != null) { - String[] idents = config.getString("sites.idents").split( - "\\s*,\\s*", 0); - - for (String id : idents) { - siteList.add(id); + String[] sites = config.getStringArray("sites.idents"); + if (sites != null && sites.length > 0) { + for (String site : sites) { + siteList.add(site); } } } From c6e0f2dc7c21b732b74a5fe700efb4849477042e Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Tue, 5 May 2015 12:18:47 -0500 Subject: [PATCH 27/46] Omaha #4462 Always set text product's site when writing standard text product. Former-commit-id: 14b7158f8dc7d5ea35ff95fd03957527760d72ba --- .../edex/plugin/text/dao/StdTextProductDao.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.text/src/com/raytheon/uf/edex/plugin/text/dao/StdTextProductDao.java b/edexOsgi/com.raytheon.uf.edex.plugin.text/src/com/raytheon/uf/edex/plugin/text/dao/StdTextProductDao.java index 3d34715201..d70d68b19e 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.text/src/com/raytheon/uf/edex/plugin/text/dao/StdTextProductDao.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.text/src/com/raytheon/uf/edex/plugin/text/dao/StdTextProductDao.java @@ -100,6 +100,7 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger; * 10/16/2014 3454 bphillip Upgrading to Hibernate 4 * 10/28/2014 3454 bphillip Fix usage of getSession() * Jan 27, 2015 4031 rferrel Resolve AFOS PILs site conflict using preferredAfosFirstLetter. + * May 05, 2015 4462 rferrel {@link #write(StdTextProduct)} when missing set the textProduct's site. * * * @author garmendariz @@ -220,6 +221,22 @@ public class StdTextProductDao extends CoreDao { prodId.setNnnid(nnn); prodId.setXxxid(xxx); Session session = this.getSession(); + String site = textProduct.getProdId().getSite(); + if ((site == null) || site.trim().isEmpty()) { + // Determine product site. + if (xxx.trim().length() == MAX_FIELD_LENGTH) { + site = SiteMap.getInstance().getSite4LetterId(xxx); + } else { + site = SiteMap.getInstance().getSite4LetterId( + SiteUtil.getSite()); + } + if (logger.isInfoEnabled()) { + logger.info("Write \"" + ccc + nnn + xxx + + "\" setting site to " + site); + } + textProduct.getProdId().setSite(site); + } + try { try { Query query = session.createQuery("SELECT refTime from " From c8a7c14fbd6a420d720e5e9eed7053b74701b7a0 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Tue, 5 May 2015 15:43:38 -0500 Subject: [PATCH 28/46] Omaha #4462 delta script of populat blank sites' in stdtextproducts table. Former-commit-id: 8845b12e74bd6183f86cdc998b2fde24dc9bf923 --- .../14.4.1/DR4462/updateStdTextProducts.sh | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 deltaScripts/14.4.1/DR4462/updateStdTextProducts.sh diff --git a/deltaScripts/14.4.1/DR4462/updateStdTextProducts.sh b/deltaScripts/14.4.1/DR4462/updateStdTextProducts.sh new file mode 100755 index 0000000000..974156a957 --- /dev/null +++ b/deltaScripts/14.4.1/DR4462/updateStdTextProducts.sh @@ -0,0 +1,76 @@ +#!/bin/bash +## +# 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. +## + +# Issue: #4462 Update script to update stdtextprodcts entries with blank site values. +# +# This script will modify table stdtextproducts in the fxatext.public schema. +# +PSQL="/awips2/psql/bin/psql" + +if [ ${#1} != 4 ] ; then + echo "ERROR: First argument must be local site to use in the stdtextproducts table. Example: KOAX" + exit 1 +else + siteId=${1} + siteLtr=${siteId:0:1} +fi + +if [ ! -f ${PSQL} ]; +then + echo "ERROR: The PSQL executable does not exist - ${PSQL}." + echo "FATAL: Update Failed!" + exit 1 +fi + +UPDATE_BY_XXX="update public.stdtextproducts set site = '${siteLtr}' || xxxid where site='' and xxxid not like '% ';" +UPDATE_LOC_SITE="update public.stdtextproducts set site='${siteId}' where site='' and xxxid like '% ';" + +function updateXXXentries +{ + echo "INFO: Updating stdtextproducts using xxxid" +${PSQL} -U awips -d fxatext -a -c "${UPDATE_BY_XXX}" + if [ $? -ne 0 ]; + then + echo "FATAL: Update by xxxid Failed!" + exit 1 + fi + echo "INFO: Completed updating stdtextproducts using xxxid." +} + +function updateSITEentries +{ + echo "INFO: Updating stdtextproduct table's site using local site." +${PSQL} -U awips -d fxatext -a -c "${UPDATE_LOC_SITE}" + if [ $? -ne 0 ]; + then + echo "FATAL: unable to update stdtextproducts using local site." + exit 1 + fi + echo "INFO: Finish updating stdtextproducts using local site." +} + +echo "INFO: start update stdtextproducts" +updateXXXentries +updateSITEentries +echo "INFO: finish update stdtextproducts" +exit 0 + + From c0cc6d7365bec8a266568a9d1a05fae92deab93d Mon Sep 17 00:00:00 2001 From: Richard Peter Date: Wed, 6 May 2015 09:17:50 -0500 Subject: [PATCH 29/46] Omaha #4468 - Fix gribDatasets_NCEP-7.xml typos Change-Id: I5cd8f130c86cde73b88b75017cc46dce7dbaed34 Former-commit-id: 3185ab93ef9d1ba7efbd59f24cc3c8a270938853 --- .../base/grid/datasetInfo/gribDatasets_NCEP-7.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/utility/common_static/base/grid/datasetInfo/gribDatasets_NCEP-7.xml b/edexOsgi/com.raytheon.edex.plugin.grib/utility/common_static/base/grid/datasetInfo/gribDatasets_NCEP-7.xml index 80741ad79d..88df334603 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/utility/common_static/base/grid/datasetInfo/gribDatasets_NCEP-7.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/utility/common_static/base/grid/datasetInfo/gribDatasets_NCEP-7.xml @@ -77,12 +77,12 @@ GFS20-PAC - GFS-PAC-20KM + GFS-PAC-20KM
3
GFS20-PRICO - GFS-PRICO-20KM + GFS-PRICO-20KM
3
From 3b5a5bc44ec8229024fed25d01b9eb39650d6124 Mon Sep 17 00:00:00 2001 From: "Sean.Webb" Date: Wed, 6 May 2015 10:47:11 -0400 Subject: [PATCH 30/46] ASM #17467 - Commented out MRMS entry Change-Id: I8c9ffd223be82c3db4d9bad55cb1d5c93ffa6c68 Former-commit-id: e09eb0800c7798bc81dc8e5f617a7460cba1cae8 --- rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 83c723d1ef..e754168efa 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -783,5 +783,5 @@ NGRID ^(Y.C[A-MZ][05789][0-9]) (KWBY) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/] 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 # MRMS -NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 +#NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 From 4a66af9dac756cc6c0dba24c72d6b3da35b08c07 Mon Sep 17 00:00:00 2001 From: Shawn Hooper Date: Wed, 6 May 2015 11:01:18 -0500 Subject: [PATCH 31/46] Revert "ASM #17467 - Commented out MRMS entry" This reverts commit 3b5a5bc44ec8229024fed25d01b9eb39650d6124 [formerly e09eb0800c7798bc81dc8e5f617a7460cba1cae8]. Change-Id: Iaf756b38b02a1cc451045f43103730f48ae8d506 Former-commit-id: 22308ff720605ae3d915226f308261b0876035ae --- rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e754168efa..83c723d1ef 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -783,5 +783,5 @@ NGRID ^(Y.C[A-MZ][05789][0-9]) (KWBY) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/] 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 # MRMS -#NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 +NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 From 933c8172e74522fac9f9a57a6f6836513627f20a Mon Sep 17 00:00:00 2001 From: "Sean.Webb" Date: Wed, 6 May 2015 11:00:06 -0400 Subject: [PATCH 32/46] ASM #17468 - Commented out MRMS pattern Change-Id: I43c9d5df9cc30f6bf9ec2a3929999cb3cb4c12f7 Former-commit-id: c341f3ef9f3ffc4fd313966ff4e85a19e9ca55b3 --- rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 83c723d1ef..e754168efa 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -783,5 +783,5 @@ NGRID ^(Y.C[A-MZ][05789][0-9]) (KWBY) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/] 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 # MRMS -NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 +#NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 From c8be7b62d7d95d795d5385ed5b39129b33db8867 Mon Sep 17 00:00:00 2001 From: Ron Anderson Date: Wed, 6 May 2015 13:17:08 -0500 Subject: [PATCH 33/46] Omaha #4467 Add support for mixedCase to runIFPText. Change-Id: I69c063596d175ea89a2b4537722bdb1ff399cb55 Former-commit-id: 3cc39323a55aaec6b38356724d2949605d4fde37 --- .../textUtilities/headline/FormatterRunner.py | 105 +++++++++++++----- 1 file changed, 80 insertions(+), 25 deletions(-) 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 e87d3503f4..288cb7edf5 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 @@ -26,7 +26,6 @@ import JUtil, VarDictGroker import RedirectLogging import UFStatusHandler -from java.io import File # # Runs the text formatter to generate text products # @@ -40,6 +39,9 @@ from java.io import File # 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. +# 05/06/2015 #4467 randerso Convert to upper case before writing to files if +# mixed case is not enabled for the product. +# Cleaned up file writing code # # @@ -104,6 +106,33 @@ def executeFromJava(databaseID, site, username, dataMgr, forecastList, logFile, RedirectLogging.restore() return forecasts +def getPid(forecast): + # taken from ProductParser.py + import re + + sl = r'^' # start of line + el = r'\s*?\n' # end of line + id3 = r'[A-Za-z]{3}' # 3 charater word + empty = r'^\s*' + el # empty line + + wmoid = r'(?P[A-Z]{4}\d{2})' # wmoid + fsid = r'(?P[A-Z]{4})' # full station id + pit = r'(?P\d{6})' # product issuance time UTC + ff = r'(?P ' + id3 + ')?' # "funny" field + + # CI block + ci_start = sl + wmoid + ' ' + fsid + ' ' + pit + ff + el + awipsid = r'(?P(?P[A-Z0-9]{3})(?P[A-Z0-9]{1,3}))' + el + ci_block = r'(?P' + ci_start + awipsid + '\n?)' + + ci_re = re.compile(ci_block) + + pid = None + m = ci_re.search(forecast) + if m is not None: + pid = m.group('cat') + + return pid def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode, username, dataMgr, serverFile=None, @@ -234,15 +263,31 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode, # For each Forecast Type, # Create generate forecast - forecasts = "" + forecasts = "" # returned value + outForecasts = "" # written to output files for forecastType in forecastList: forecast = formatter.getForecast(forecastType, argDict) forecasts = forecasts + forecast + + # Convert data written to files to upper case if required + mixedCase = False + pid = getPid(forecast) + if pid is None: + logger.warning("Unable to determine PID: defaulting to upper case") + else: + from com.raytheon.uf.common.dataplugin.text.db import MixedCaseProductSupport + mixedCase = MixedCaseProductSupport.isMixedCase(pid) + + if mixedCase: + outForecasts = outForecasts + forecast + else: + outForecasts = outForecasts + forecast.upper() logger.info("Text:\n" + str(forecasts)) + try: outputFile = argDict["outputFile"] - success = writeToFile(forecasts, outputFile, "w") + success = writeToFile(outForecasts, outputFile, "w") if success == 0: print "Couldn't open output file", outputFile logger.error("Couldn't open output file: ", outputFile) @@ -252,7 +297,7 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode, try: outputFile = argDict["serverOutputFile"] - success = writeToFile(forecasts, outputFile, "w") + success = writeToFile(outForecasts, outputFile, "w") if success == 0: print "Couldn't open output file", outputFile logger.error("Couldn't open output file: ", outputFile) @@ -263,7 +308,7 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode, try: appendFile = argDict["appendFile"] - success = writeToFile(forecasts, appendFile, "a") + success = writeToFile(outForecasts, appendFile, "a") if success == 0: print "Couldn't open append file", appendFile logger.error("Couldn't write to append file: ", appendFile) @@ -274,7 +319,7 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode, try: serverFile = argDict["serverFile"] writeToSite = (username == "SITE") - success = writeToServerFile(forecasts, serverFile, writeToSite) + success = writeToServerFile(outForecasts, serverFile, writeToSite) if success == 0: print "Couldn't open server output file", serverFile logger.error("Couldn't open server output file: ", serverFile) @@ -282,6 +327,8 @@ def runFormatter(databaseID, site, forecastList, cmdLineVarDict, vtecMode, except: pass + del outForecasts + # Remove any lat/lon areas created temporarily #global LatLonIds #argDict["ifpClient"].deleteReferenceData(LatLonIds) @@ -308,29 +355,37 @@ def getAbsTime(timeStr): return AbsTime.absTimeYMD(year, month, day, hour, minute) def writeToFile(forecasts, outputFile, mode): - if not outputFile is None and outputFile != "": - outfile = open(outputFile, mode) - os.chmod(outputFile, 0644) - if outfile is None: + if outputFile: + logger.info("Writing forecast to " + outputFile) + try: + with open(outputFile, mode) as outfile: + outfile.write(forecasts) + + os.chmod(outputFile, 0644) + except: + logger.exception("Error writing forecast to "+outputFile) return 0 - else: - outfile.write(forecasts) - outfile.close() return 1 def writeToServerFile(forecasts, outputFile, writeToSite): - if not outputFile is None and outputFile != "": - if writeToSite: - ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.SITE) - else: - ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.USER) - filePath = File.separatorChar.join(["gfe", "text", "PRODGEN", outputFile + ".PRODGEN"]) - lFile = PATH_MGR.getLocalizationFile(ctx, filePath) - javaFile = lFile.getFile() - outfile = open(javaFile.getAbsolutePath(), 'w') - outfile.write(forecasts) - outfile.close() - return lFile.save() + if outputFile: + try: + if writeToSite: + ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.SITE) + else: + ctx = PATH_MGR.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.USER) + filePath = PATH_MGR.SEPARATOR.join(["gfe", "text", "PRODGEN", outputFile + ".PRODGEN"]) + lFile = PATH_MGR.getLocalizationFile(ctx, filePath) + logger.info("Writing forecast to " + str(lFile)) + + from LockingFile import File + with File(lFile.getFile(), "", 'w') as outfile: + outfile.write(forecasts) + + return lFile.save() + except: + logger.exception("Error writing forecast to " + str(lFile)) + return 0 return 1 def getScripts(paths, nameMap, definitionMap): From 2a1cad119bf6d3ff3e44af770d3d4b1925054dfa Mon Sep 17 00:00:00 2001 From: Slav Korolev Date: Thu, 7 May 2015 10:47:48 -0400 Subject: [PATCH 34/46] Omaha #4434 - Added pattern for GFS20 Former-commit-id: 87849fbc952fb4b5ae58c43b00c118e1ab100c61 --- .../Installer.ldm/patch/etc/pqact.conf.template | 9 +++++++++ 1 file changed, 9 insertions(+) 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 83c723d1ef..e3d54e9fca 100644 --- a/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template +++ b/rpms/awips2.core/Installer.ldm/patch/etc/pqact.conf.template @@ -38,6 +38,7 @@ #20140424 3068 dgilling Add pattern for MetOp-B ASCAT T winds. #20140612 3230 rferrel Add pattern for URMA. #20150202 4066 rferrel Add pattern form Earth Networks Total Lightning: SFPA42 +#20150507 4434 skorolev Add pattern for GFS20 #*************************************************************** # AWIPS 1 PATTERN GRAPHIC ^[PQ].* /redbook/Raw # PGNA00 KWNS 010001 !redbook 1_1/NMCGPHMCD/MCDSUM/PXSF001CN/20110201 0001 @@ -785,3 +786,11 @@ NGRID ^(Y.C[A-MZ][05789][0-9]) (KWBY) (..)(..)(..)[^!]*!(grib|grib2)/[^/]*/([^/] # MRMS NGRID ^(YAU[CDLMPQS][0-2][0-9]) (KWNR) (..)(..)(..)[^!]*!(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 + +# GFS20 - Alaska, Puerto Rico, Pacific and CONUS +# YUFC97 KWBC 051200 !grib2/ncep/GFS/#255/201505051200F012/UREL/2 K*m**2*kg-1*s-1 +# ZONK67 KWBC 051200 !grib2/ncep/GFS/#215/201505051200F021/OMEG/675 hPa PRES +# ZVBK86 KWBC 051200 !grib2/ncep/GFS/#217/201505051200F021/VREL/180-150 hPa PDLY + +NGRID ^([YZ][BCE-HMO-Y][BEFN][A-Z][0-9][0-9]) KWBC (..)(..)(..) [^!]*!(grib2)/[^/]*/([^/]*)/#([^/]*)/([0-9]{8})([0-9]{4})(F[0-9]{3})/([^/]*) + FILE -overwrite -log -close -edex /data_store/grib2/(\2:yyyy)(\2:mm)\2/\3/\6/GRID\7/\9Z_\(10)_\(11)_\1_KWBC_\2\3\4_(seq).\5.%Y%m%d%H \ No newline at end of file From 565fbb949c304de1fdc45696b909a4571e7c56bf Mon Sep 17 00:00:00 2001 From: Ana Rivera Date: Fri, 8 May 2015 12:22:53 +0000 Subject: [PATCH 35/46] VLab Issue #8081 - Baseline NWPS Weather Element groups; fixes #8081 Change-Id: I901d43e6474cb659407b6bcf1e1798c7de2dc341 Former-commit-id: 5e749f9f2b1bddbb57d1e61d0211982db90656cd --- .../localization/gfe/weGroups/nwpsCG1.xml | 6 +++++ .../gfe/weGroups/nwpsTrackingCG0.xml | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsCG1.xml create mode 100644 cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsTrackingCG0.xml diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsCG1.xml b/cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsCG1.xml new file mode 100644 index 0000000000..815bae2ced --- /dev/null +++ b/cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsCG1.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsTrackingCG0.xml b/cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsTrackingCG0.xml new file mode 100644 index 0000000000..d543c9adb2 --- /dev/null +++ b/cave/com.raytheon.viz.gfe/localization/gfe/weGroups/nwpsTrackingCG0.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + From 037427861a5c68fc1b1a719e4d68f57e1addf93e Mon Sep 17 00:00:00 2001 From: Melissa Porricel Date: Fri, 8 May 2015 12:51:59 -0400 Subject: [PATCH 36/46] ASM #7951 - Add RTMA menu items to Misc/Aviation VB menu Change-Id: Idddde521d6c2403d8a76f3341e977d217b8469d6 Former-commit-id: 4f1ad3c4db5d5e8ec77870c34a9d66c440be2691 --- .../fields/planview-timeseries/sfc2d/aviation.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cave/com.raytheon.viz.volumebrowser/localization/menus/volumebrowser/fields/planview-timeseries/sfc2d/aviation.xml b/cave/com.raytheon.viz.volumebrowser/localization/menus/volumebrowser/fields/planview-timeseries/sfc2d/aviation.xml index 5040f304ef..48d43f5c54 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/menus/volumebrowser/fields/planview-timeseries/sfc2d/aviation.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/menus/volumebrowser/fields/planview-timeseries/sfc2d/aviation.xml @@ -19,7 +19,10 @@ further_licensing_information. --> + + + From 61157be4f8e2bf227d537adfde2185c89c1603aa Mon Sep 17 00:00:00 2001 From: David Friedman Date: Fri, 8 May 2015 18:26:37 +0000 Subject: [PATCH 37/46] ASM #17310 - WarnGen: a large portion of hatched area was not included in polygon Change-Id: I77c1a45f67e41e0ad0d9cdcca006f43c9f30e7f1 Former-commit-id: 7e97e943d7c6b291bf3e1b03540b623a8ec73677 --- .../raytheon/viz/warngen/gis/PolygonUtil.java | 44 +++++++++++++++++-- .../viz/warngen/gui/WarngenLayer.java | 5 +++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java index 9943db6592..8af61acb90 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/PolygonUtil.java @@ -89,6 +89,7 @@ import com.vividsolutions.jts.precision.SimpleGeometryPrecisionReducer; * 06/27/2014 DR 17443 D. Friedman Fix some odd cases in which parts of a polygon not covering a * hatched area would be retained after redrawing. * 07/22/2014 DR 17475 Qinglu Lin Updated createPolygonByPoints() and created second createPolygonByPoints(). + * 05/08/2015 DR 17310 D. Friedman Prevent reducePoints from generating invalid polygons. * * * @author mschenke @@ -543,7 +544,6 @@ public class PolygonUtil { GeometryFactory gf = new GeometryFactory(); points.add(new Coordinate(points.get(0))); - truncate(points, 2); Polygon rval = gf.createPolygon(gf.createLinearRing(points .toArray(new Coordinate[points.size()])), null); @@ -799,6 +799,7 @@ public class PolygonUtil { int npts = pts.length; double xavg = 0, yavg = 0; int[] yesList = new int[npts]; + boolean[] excludeList = new boolean[npts]; int nyes = 0; int k, k1, k2, kn, y, simple; double bigDis, maxDis, dis, dx, dy, dx0, dy0, bas; @@ -863,6 +864,8 @@ public class PolygonUtil { k = 0; if (k == k2) break; + if (excludeList[k]) + continue; dx = pts[k].x - pts[k1].x; dy = pts[k].y - pts[k1].y; dis = dx * dx0 + dy * dy0; @@ -870,6 +873,8 @@ public class PolygonUtil { dis = -dis; else dis -= bas; + double newMaxDis = maxDis; + int newSimple = simple; if (dis <= 0) { if (simple == 0) continue; @@ -877,15 +882,30 @@ public class PolygonUtil { if (dis < 0) dis = -dis; } else if (simple != 0) - maxDis = simple = 0; - if (dis < maxDis) + newMaxDis = newSimple = 0; + if (dis < newMaxDis) { + maxDis = newMaxDis; continue; + } + if (! checkReducePointsValid(pts, yesList, nyes, k)) { + excludeList[k] = true; + continue; + } + simple = newSimple; maxDis = dis; kn = k; } k1 = k2; } + Arrays.fill(excludeList, false); + if (kn < 0) { + statusHandler.debug( + String.format("reducePoints(..., %d): Unable to find a valid point\npoints: %s", + maxNpts, points)); + break; + } + if (simple != 0 && nyes > 2) { if (maxDis * 40 < bigDis) break; @@ -909,6 +929,24 @@ public class PolygonUtil { points.addAll(Arrays.asList(Arrays.copyOf(pts, npts))); } + private boolean checkReducePointsValid(Coordinate[] pts, int[] yesList, int nyes, int k) { + Coordinate[] verts = new Coordinate[nyes + 2]; + int vi = 0; + for (int i = 0; i < nyes; ++i) { + if (k >= 0 && k < yesList[i]) { + verts[vi++] = pts[k]; + k = -1; + } + verts[vi++] = pts[yesList[i]]; + } + if (k >= 0) { + verts[vi++] = pts[k]; + } + verts[verts.length - 1] = new Coordinate(verts[0]); + GeometryFactory gf = new GeometryFactory(); + return gf.createPolygon(verts).isValid(); + } + /** * A1 ported point reduction method 2 * diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java index 29b6ef2958..ec2bfcf435 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java @@ -234,6 +234,7 @@ import com.vividsolutions.jts.io.WKTReader; * any of them is missing. * 11/03/2014 3353 rferrel Ignore GeoSpatialData notification when this is the instance layer will do an update. * 02/25/2014 3353 rjpeter Fix synchronized use case, updated to not create dialog before init is finished. + * 05/08/2015 ASM #17310 D. Friedman Log input polygon when output of AreaHatcher is invalid. * * * @author mschenke @@ -570,6 +571,10 @@ public class WarngenLayer extends AbstractStormTrackResource { outputHatchedWarningArea = createWarnedArea( latLonToLocal(outputHatchedArea), latLonToLocal(warningArea)); + if (! outputHatchedArea.isValid()) { + statusHandler.debug(String.format("Input %s redrawn to invalid %s", + inputWarningPolygon, outputHatchedArea)); + } } this.hatchedArea = outputHatchedArea; this.hatchedWarningArea = outputHatchedWarningArea; From 92090243be96b0d1f95f35abb2638faf494c642b Mon Sep 17 00:00:00 2001 From: "Fay.Liang" Date: Fri, 8 May 2015 15:55:40 -0400 Subject: [PATCH 38/46] ASM #17252 - Text lightning decoding problem after 14.3.1 upgrade Change-Id: Idc866ed518419d0c20ca51fdc118f0878082cc24 Former-commit-id: adbf1f76743d9dd6bbf7785f83984e1bdf16e7f2 --- .../plugin/textlightning/TextLightningDecoder.java | 10 ++-------- .../binlightning/impl/BaseLightningPoint.java | 3 ++- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/TextLightningDecoder.java b/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/TextLightningDecoder.java index c85564bf5d..6038ae8285 100644 --- a/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/TextLightningDecoder.java +++ b/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/TextLightningDecoder.java @@ -45,6 +45,8 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Feb 12, 2014 2655 njensen Set source * Jun 05, 2014 3226 bclement LightningStikePoint refactor * Jun 10, 2014 3226 bclement fixed source + * May 8, 2015 DR17252 MPorricelli Removed setting of source. + * Source set in TextLightningParser. * * * @@ -57,12 +59,6 @@ public class TextLightningDecoder extends AbstractDecoder implements private String traceId = null; - /* - * inferred from Wufeng Zhou comment in BinLightningDecoderUtil, stands for - * World Wide Lightning Location Network - */ - private static final String SOURCE = "WWLLN"; - /** * Construct a TextLightning decoder. Calling hasNext() after construction * will return false, decode() will return a null. @@ -103,8 +99,6 @@ public class TextLightningDecoder extends AbstractDecoder implements report.setTraceId(traceId); - report.setSource(SOURCE); - return new PluginDataObject[] { report }; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/BaseLightningPoint.java b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/BaseLightningPoint.java index f336e392b5..fb02050547 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/BaseLightningPoint.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/BaseLightningPoint.java @@ -34,6 +34,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jun 3, 2014 3226 bclement Initial creation + * May 8, 2015 DR17252 MPorricelli Use HOUR_OF_DAY for setHour * * * @@ -118,7 +119,7 @@ public class BaseLightningPoint { * Hour of the day [0..23]. */ public void setHour(int hour) { - this.time.set(Calendar.HOUR, hour); + this.time.set(Calendar.HOUR_OF_DAY, hour); } /** From 95ab6a74b1d65a460bd55ac55385747993b86a8a Mon Sep 17 00:00:00 2001 From: "Fay.Liang" Date: Sun, 10 May 2015 00:06:25 -0400 Subject: [PATCH 39/46] ASM #17476 - HWR: Certain marine observations missing from product Change-Id: Ib289f53e3f8cb2f82df3ac512540917eae072a08 Former-commit-id: 272927b1a4e27e59ff82353ed12de68634efd7da --- .../org.apache.thrift/lib/libthrift-0.9.0.so | Bin 3748654 -> 4334501 bytes .../org.apache.thrift/lib/libthriftz-0.9.0.so | Bin 156912 -> 218334 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/nativeLib/org.apache.thrift/lib/libthrift-0.9.0.so b/nativeLib/org.apache.thrift/lib/libthrift-0.9.0.so index fa2aa181f176590f36997cd4fa7dd8561a4fee3a..2ac48cd0880c73a74e09f10bfba4907a402a6ffa 100755 GIT binary patch literal 4334501 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�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