From ebb221d935c48f628db85cfbcc11f50116177b9f Mon Sep 17 00:00:00 2001 From: Ron Anderson Date: Mon, 9 Feb 2015 11:41:17 -0600 Subject: [PATCH 1/4] Issue #4099 Fix ETNs for products that span year-end. (cherry picked from commit c7a8c9b049ae8d73ffb61765f31374e01d1d2a33) Former-commit-id: 7ca4dd9ba059035e366807d4928768121fdd0712 --- .../textUtilities/headline/HazardsTable.py | 3 ++- .../build.edex/esb/conf/logback-ingest.xml | 2 +- .../uf/edex/activetable/ActiveTable.java | 19 ++++++++++--------- .../common_static/base/vtec/ActiveTable.py | 3 ++- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/HazardsTable.py b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/HazardsTable.py index 4fa223d733..8e76988684 100644 --- a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/HazardsTable.py +++ b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/textUtilities/headline/HazardsTable.py @@ -35,6 +35,7 @@ # 02/05/14 2774 dgilling Fix error logging statements in # __warnETNduplication() and # __highestETNActiveTable. +# 02/05/15 4099 randerso Fixed exception handling in __getActiveTable # @@ -932,7 +933,7 @@ class HazardsTable(VTECTableUtil.VTECTableUtil): except: self.log.exception("Unable to access VTEC Active Table: ") - raise Exception, s + raise def __createCityHazards(self): if not self.__accurateCities: diff --git a/edexOsgi/build.edex/esb/conf/logback-ingest.xml b/edexOsgi/build.edex/esb/conf/logback-ingest.xml index 3b9c5a57ec..ddd0efca77 100644 --- a/edexOsgi/build.edex/esb/conf/logback-ingest.xml +++ b/edexOsgi/build.edex/esb/conf/logback-ingest.xml @@ -71,7 +71,7 @@ - + ${edex.home}/logs/edex-${edex.run.mode}-activeTableChange-%d{yyyyMMdd}.log 30 diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java b/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java index 459ca8251b..8f821b2ed6 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java +++ b/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java @@ -55,9 +55,9 @@ import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.PerformanceStatus; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.common.time.util.ITimer; import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.common.util.FileUtil; import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.database.DataAccessLayerException; @@ -96,6 +96,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * Pass issuance site id to getActiveTable() * in updateActiveTable() so records will * be updated correctly. + * Feb 05, 2015 4099 randerso Fixed latest ETN query for year-end * * * @@ -359,14 +360,14 @@ public class ActiveTable { PythonScript python = threadLocalPythonScript.get(); try { result = (MergeResult) python.execute("mergeFromJava", args); - } catch (JepException e) { - statusHandler.handle(Priority.PROBLEM, - "Error updating active table", e); - } - } catch (Exception e) { + } catch (JepException e) { statusHandler.handle(Priority.PROBLEM, - "Error initializing active table python", e); + "Error updating active table", e); } + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Error initializing active table python", e); + } return result; } @@ -433,8 +434,8 @@ public class ActiveTable { if (latestEtn && currentTime != null) { Calendar yearStart = Calendar.getInstance(); yearStart.set(currentTime.get(Calendar.YEAR), Calendar.JANUARY, - 0, 0, 0); - query.addQueryParam("startTime", yearStart, "greater_than"); + 1, 0, 0); + query.addQueryParam("issueTime", yearStart, "greater_than"); query.addOrder("etn", false); query.setMaxResults(1); } diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ActiveTable.py b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ActiveTable.py index 0105bf91b6..9a06bf3a6a 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ActiveTable.py +++ b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ActiveTable.py @@ -31,6 +31,7 @@ # 06/17/13 #3296 randerso Moved active table backup and purging # to a separate thread in java. # Added performance logging +# 02/05/15 #4099 randerso Changed log level of year-end issuance tweak # import time @@ -119,7 +120,7 @@ class ActiveTable(VTECTableUtil.VTECTableUtil): if oldYear < newYear: if (newR['act'] == "EXP" and newR['endTime'] == oldR['endTime']) or \ self.__overlaps((oldR['startTime'],oldR['endTime']), (newR['startTime'],newR['endTime'])): - LogStream.logVerbose("Reset issuance time to last year:", + LogStream.logEvent("Reset issuance time to last year:", "\nNewRec: ", self.printEntry(newR), "OldRec: ", self.printEntry(oldR)) newR['issueTime'] = lastYearIssueTime From def338c49fa20e82220c7a2d4006381d83c7b402 Mon Sep 17 00:00:00 2001 From: David Gillingham Date: Tue, 24 Feb 2015 12:39:03 -0600 Subject: [PATCH 2/4] Issue #4127: Add ClusterTask-backed write lock to ActiveTable. Change-Id: I54309f369e7ef872fd102a764641569d95c62799 Former-commit-id: c564462d34bae64c3339339254d5cb6caba70fda --- .../uf/edex/activetable/ActiveTable.java | 268 +++++++++++------- .../uf/edex/database/dao/CoreDao.java | 23 ++ 2 files changed, 184 insertions(+), 107 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java b/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java index 8f821b2ed6..32f1b8adf6 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java +++ b/edexOsgi/com.raytheon.uf.edex.activetable/src/com/raytheon/uf/edex/activetable/ActiveTable.java @@ -61,6 +61,10 @@ import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.common.util.FileUtil; import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.database.cluster.ClusterLockUtils; +import com.raytheon.uf.edex.database.cluster.ClusterLockUtils.LockState; +import com.raytheon.uf.edex.database.cluster.ClusterTask; +import com.raytheon.uf.edex.database.cluster.handler.CurrentTimeClusterLockHandler; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; import com.raytheon.uf.edex.database.query.DatabaseQuery; @@ -97,6 +101,8 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * in updateActiveTable() so records will * be updated correctly. * Feb 05, 2015 4099 randerso Fixed latest ETN query for year-end + * Feb 23, 2015 4127 dgilling Use cluster locking to only allow 1 active + * table write at a time. * * * @@ -111,6 +117,10 @@ public class ActiveTable { private static final Logger changeLog = Logger .getLogger("ActiveTableChange"); + private static final String ACTIVE_TABLE_LOCK_NAME = "ActiveTableWriteLock"; + + private static final long DEFAULT_LOCK_TIMEOUT = 5 * TimeUtil.MILLIS_PER_MINUTE; + private static ThreadLocal threadLocalPythonScript = new ThreadLocal() { /* @@ -285,7 +295,7 @@ public class ActiveTable { */ private void updateActiveTable(String siteId, List newRecords, float offsetSecs) { - if (newRecords.size() > 0) { + if (!newRecords.isEmpty()) { ActiveTableMode mode = ActiveTableMode.PRACTICE; if (newRecords.get(0) instanceof OperationalActiveTableRecord) { mode = ActiveTableMode.OPERATIONAL; @@ -296,36 +306,67 @@ public class ActiveTable { IPerformanceStatusHandler perfStat = PerformanceStatus .getHandler("ActiveTable"); ITimer timer = TimeUtil.getTimer(); - timer.start(); - List activeTable = getActiveTable(issueSiteId, mode); - timer.stop(); - perfStat.logDuration("getActiveTable", timer.getElapsedTime()); + MergeResult result = null; + ClusterTask writeLock = null; + try { + boolean logFirst = true; + timer.start(); + do { + if (logFirst) { + statusHandler + .info("updateActiveTable() waiting on lock [" + + ACTIVE_TABLE_LOCK_NAME + ":" + + mode.toString() + "]."); + logFirst = false; + } + writeLock = ClusterLockUtils.lock(ACTIVE_TABLE_LOCK_NAME, + mode.toString(), new CurrentTimeClusterLockHandler( + DEFAULT_LOCK_TIMEOUT, false), true); + } while (!writeLock.getLockState().equals(LockState.SUCCESSFUL)); + statusHandler + .info("updateActiveTable() obtained lock [" + + ACTIVE_TABLE_LOCK_NAME + ":" + + mode.toString() + "]."); + timer.stop(); + perfStat.logDuration("getLock", timer.getElapsedTime()); - // get decoder sites to see if we need to backup active table - Set decoderSites = getDecoderSites(siteId); - - // if any new record is from one of the decoder sites - // we need to queue a backup - for (ActiveTableRecord rec : newRecords) { - if (decoderSites.contains(rec.getOfficeid())) { - ActiveTableBackup.queue(mode, activeTable); - break; + timer.reset(); + timer.start(); + List activeTable = getActiveTable( + issueSiteId, mode); + timer.stop(); + perfStat.logDuration("getActiveTable", timer.getElapsedTime()); + // get decoder sites to see if we need to backup active table + Set decoderSites = getDecoderSites(siteId); + // if any new record is from one of the decoder sites + // we need to queue a backup + for (ActiveTableRecord rec : newRecords) { + if (decoderSites.contains(rec.getOfficeid())) { + ActiveTableBackup.queue(mode, activeTable); + break; + } + } + timer.reset(); + timer.start(); + result = filterTable(siteId, activeTable, newRecords, mode, + offsetSecs); + timer.stop(); + perfStat.logDuration("filterTable", timer.getElapsedTime()); + timer.reset(); + timer.start(); + updateTable(siteId, result, mode); + timer.stop(); + perfStat.logDuration("updateTable", timer.getElapsedTime()); + } finally { + if (writeLock != null) { + statusHandler.info("updateActiveTable() released lock [" + + ACTIVE_TABLE_LOCK_NAME + ":" + mode.toString() + + "]."); + ClusterLockUtils.unlock(writeLock, true); } } - timer.reset(); - timer.start(); - MergeResult result = filterTable(siteId, activeTable, newRecords, - mode, offsetSecs); - timer.stop(); - perfStat.logDuration("filterTable", timer.getElapsedTime()); - - timer.reset(); - timer.start(); - updateTable(siteId, result, mode); - timer.stop(); - perfStat.logDuration("updateTable", timer.getElapsedTime()); - if (result.changeList.size() > 0) { + if (!result.changeList.isEmpty()) { sendNotification(mode, result.changeList, "VTECDecoder"); } } @@ -403,54 +444,52 @@ public class ActiveTable { ActiveTableMode mode, String phensigList, String action, String etn, Calendar currentTime, boolean requestValidTimes, boolean latestEtn) { - synchronized (ActiveTable.class) { - DatabaseQuery query = null; - CoreDao dao = null; + DatabaseQuery query = null; + CoreDao dao = null; - if (mode.equals(ActiveTableMode.OPERATIONAL)) { - query = new DatabaseQuery(OperationalActiveTableRecord.class); - dao = operationalDao; - } else { - query = new DatabaseQuery(PracticeActiveTableRecord.class); - dao = practiceDao; - } - - if (phensigList != null) { - query.addQueryParam("phensig", phensigList, "in"); - } - - if (action != null) { - query.addQueryParam("act", action, "in"); - } - - if (etn != null) { - query.addQueryParam("etn", etn, "in"); - } - - if (requestValidTimes && currentTime != null) { - // Current Time - query.addQueryParam("endTime", currentTime, "greater_than"); - } - if (latestEtn && currentTime != null) { - Calendar yearStart = Calendar.getInstance(); - yearStart.set(currentTime.get(Calendar.YEAR), Calendar.JANUARY, - 1, 0, 0); - query.addQueryParam("issueTime", yearStart, "greater_than"); - query.addOrder("etn", false); - query.setMaxResults(1); - } - - query.addQueryParam("officeid", siteId, "in"); - - List result = null; - try { - result = (List) dao.queryByCriteria(query); - } catch (DataAccessLayerException e) { - statusHandler.handle(Priority.PROBLEM, - "Error querying active table for site " + siteId, e); - } - return result; + if (mode.equals(ActiveTableMode.OPERATIONAL)) { + query = new DatabaseQuery(OperationalActiveTableRecord.class); + dao = operationalDao; + } else { + query = new DatabaseQuery(PracticeActiveTableRecord.class); + dao = practiceDao; } + + if (phensigList != null) { + query.addQueryParam("phensig", phensigList, "in"); + } + + if (action != null) { + query.addQueryParam("act", action, "in"); + } + + if (etn != null) { + query.addQueryParam("etn", etn, "in"); + } + + if (requestValidTimes && currentTime != null) { + // Current Time + query.addQueryParam("endTime", currentTime, "greater_than"); + } + if (latestEtn && currentTime != null) { + Calendar yearStart = Calendar.getInstance(); + yearStart.set(currentTime.get(Calendar.YEAR), Calendar.JANUARY, 1, + 0, 0); + query.addQueryParam("issueTime", yearStart, "greater_than"); + query.addOrder("etn", false); + query.setMaxResults(1); + } + + query.addQueryParam("officeid", siteId, "in"); + + List result = null; + try { + result = (List) dao.queryByCriteria(query); + } catch (DataAccessLayerException e) { + statusHandler.handle(Priority.PROBLEM, + "Error querying active table for site " + siteId, e); + } + return result; } /** @@ -463,23 +502,12 @@ public class ActiveTable { */ private static void updateTable(String siteId, MergeResult changes, ActiveTableMode mode) { - synchronized (ActiveTable.class) { - List updated = changes.updatedList; - List purged = changes.purgedList; + List updated = changes.updatedList; + List purged = changes.purgedList; - CoreDao dao = null; - if (mode.equals(ActiveTableMode.OPERATIONAL)) { - dao = operationalDao; - } else { - dao = practiceDao; - } - for (ActiveTableRecord update : updated) { - dao.saveOrUpdate(update); - } - for (ActiveTableRecord delete : purged) { - dao.delete(delete); - } - } + CoreDao dao = (ActiveTableMode.OPERATIONAL.equals(mode)) ? operationalDao + : practiceDao; + dao.bulkSaveOrUpdateAndDelete(updated, purged); } /** @@ -550,22 +578,23 @@ public class ActiveTable { ActiveTableMode tableName, List newRecords, float timeOffset, boolean makeBackup, boolean runIngestAT, String xmlSource) throws JepException { + String scriptName = runIngestAT ? "ingestAT.py" : "MergeVTEC.py"; + IPathManager pathMgr = PathManagerFactory.getPathManager(); + LocalizationContext commonCx = pathMgr.getContext( + LocalizationType.COMMON_STATIC, LocalizationLevel.BASE); + String scriptPath = pathMgr.getFile(commonCx, + FileUtil.join(ActiveTablePyIncludeUtil.VTEC, scriptName)) + .getPath(); + String pythonIncludePath = PyUtil.buildJepIncludePath( + ActiveTablePyIncludeUtil.getCommonPythonIncludePath(), + ActiveTablePyIncludeUtil.getVtecIncludePath(siteId), + ActiveTablePyIncludeUtil.getGfeConfigIncludePath(siteId), + ActiveTablePyIncludeUtil.getIscScriptsIncludePath()); + MergeResult result = null; PythonScript script = null; + ClusterTask writeLock = null; try { - String scriptName = runIngestAT ? "ingestAT.py" : "MergeVTEC.py"; - IPathManager pathMgr = PathManagerFactory.getPathManager(); - LocalizationContext commonCx = pathMgr.getContext( - LocalizationType.COMMON_STATIC, LocalizationLevel.BASE); - String scriptPath = pathMgr.getFile(commonCx, - FileUtil.join(ActiveTablePyIncludeUtil.VTEC, scriptName)) - .getPath(); - String pythonIncludePath = PyUtil.buildJepIncludePath( - ActiveTablePyIncludeUtil.getCommonPythonIncludePath(), - ActiveTablePyIncludeUtil.getVtecIncludePath(siteId), - ActiveTablePyIncludeUtil.getGfeConfigIncludePath(siteId), - ActiveTablePyIncludeUtil.getIscScriptsIncludePath()); - try { script = new PythonScript(scriptPath, pythonIncludePath, ActiveTable.class.getClassLoader()); @@ -575,6 +604,23 @@ public class ActiveTable { throw e; } + boolean logFirst = true; + do { + if (logFirst) { + statusHandler.info("mergeRemoteTable() waiting on lock [" + + ACTIVE_TABLE_LOCK_NAME + ":" + + tableName.toString() + "]."); + logFirst = false; + } + writeLock = ClusterLockUtils.lock(ACTIVE_TABLE_LOCK_NAME, + tableName.toString(), + new CurrentTimeClusterLockHandler(DEFAULT_LOCK_TIMEOUT, + false), true); + } while (!writeLock.getLockState().equals(LockState.SUCCESSFUL)); + statusHandler.info("mergeRemoteTable() obtained lock [" + + ACTIVE_TABLE_LOCK_NAME + ":" + tableName.toString() + + "]."); + try { String site4Char = SiteMap.getInstance().getSite4LetterId( siteId); @@ -597,18 +643,26 @@ public class ActiveTable { "Error merging active table", e); throw e; } + + if (result != null) { + updateTable(siteId, result, tableName); + } } finally { + if (writeLock != null) { + statusHandler.info("mergeRemoteTable() released lock [" + + ACTIVE_TABLE_LOCK_NAME + ":" + tableName.toString() + + "]."); + ClusterLockUtils.unlock(writeLock, true); + } + if (script != null) { script.dispose(); script = null; } } - if (result != null) { - updateTable(siteId, result, tableName); - if (!result.changeList.isEmpty()) { - sendNotification(tableName, result.changeList, "MergeVTEC"); - } + if ((result != null) && (!result.changeList.isEmpty())) { + sendNotification(tableName, result.changeList, "MergeVTEC"); } } diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java index 943b272171..dde8965879 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/CoreDao.java @@ -101,6 +101,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * Dec 13, 2013 2555 rjpeter Added processByCriteria and fixed Generics warnings. * Jan 23, 2014 2555 rjpeter Updated processByCriteria to be a row at a time using ScrollableResults. * Apr 23, 2014 2726 rjpeter Updated processByCriteria to throw exceptions back up to caller. + * Feb 23, 2015 4127 dgilling Added bulkSaveOrUpdateAndDelete(). * * * @author bphillip @@ -1143,4 +1144,26 @@ public class CoreDao extends HibernateDaoSupport { return getSessionFactory().getClassMetadata(daoClass); } } + + /** + * Updates/saves a set of records and deletes a set of records in the + * database in a single transaction. + * + * @param updates + * Records to update or add. + * @param deletes + * Records to delete. + */ + public void bulkSaveOrUpdateAndDelete( + final Collection updates, + final Collection deletes) { + txTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + HibernateTemplate ht = getHibernateTemplate(); + ht.saveOrUpdateAll(updates); + ht.deleteAll(deletes); + } + }); + } } From a28a9e18b06d58bec229523d15d6c2f474bff6a2 Mon Sep 17 00:00:00 2001 From: "Shawn.Hooper" Date: Fri, 27 Feb 2015 14:17:34 -0500 Subject: [PATCH 3/4] ASM #17172 - Update heap size to 1536M for 14.3.1.1 64-bit Change-Id: Iea8841e91a5d4ea005fecd0e89cd55d67319db1c Former-commit-id: c96e25664a8ef82f33bbad3ea82efad90024baee --- cave/com.raytheon.viz.product.awips/awips.product | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cave/com.raytheon.viz.product.awips/awips.product b/cave/com.raytheon.viz.product.awips/awips.product index ffa33d0a95..2bab084cf2 100644 --- a/cave/com.raytheon.viz.product.awips/awips.product +++ b/cave/com.raytheon.viz.product.awips/awips.product @@ -33,7 +33,7 @@ -Dthrift.stream.maxsize=200 -Dviz.memory.warn.threshold=98 -Xmx1280M -XX:MaxDirectMemorySize=2G - -Dfile.encoding=UTF-8 -Xmx768M + -Dfile.encoding=UTF-8 -Xmx1536M From dcef82c4d6bce62965d5f01f447834cfd3c2b043 Mon Sep 17 00:00:00 2001 From: "Qinglu.Lin" Date: Fri, 27 Feb 2015 16:10:22 -0500 Subject: [PATCH 4/4] ASM #17169: WarnGen Templates: IBW marine CTA and impact updates Change-Id: I59e000340b6a82dc439128f3ad6963476b669344 Former-commit-id: 441be68f8726618225b0c7a5077443b8a7815d99 --- .../warngen/impactSpecialMarineWarning.vm | 38 ++--- .../warngen/impactSpecialMarineWarning.xml | 25 ++-- .../impactSpecialMarineWarningFollowup.vm | 134 ++++++++++-------- .../impactSpecialMarineWarningFollowup.xml | 25 ++-- .../base/warngen/impactStatements.vm | 61 +++++++- 5 files changed, 179 insertions(+), 104 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.vm b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.vm index f6a661f5fe..0647bce760 100755 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.vm +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.vm @@ -6,6 +6,8 @@ ## EVAN BOOKBINDER -- SEP 18 2013 Implemented config.vm ## PHIL KURIMSKI -- JUN 26 2014 OB14.2.2-9 ## ## ADDED DSS EVENTS ## +## UPDATED PHIL KURIMSKI -- FEB 18 2015 Implemented## +## updated CTAs ## ##################################################### #parse("config.vm") ################################################ @@ -335,7 +337,7 @@ THIS IS A TEST MESSAGE. ## THIS IS A TEST MESSAGE. ## #end #thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone}) -...${report}LOCATED ## +...${report}WAS LOCATED ## #if(${stormType} == "line") #handleClosestPoints(${list}, ${closestPoints}, ${otherClosestPoints}, ${stormType}, ${nearPhrase} , ${maxMarineNearDistance}, ${overPhrase}, ${maxMarineOverDistance}, ${marineDistanceUnits}, ${useSecondReferenceLine}) #else @@ -406,7 +408,7 @@ THOSE ATTENDING !**event/venue name or location**! ARE IN THE PATH OF ${specialE ## Comment out #parse command below to pull in Dynamic DSS Event Info ## If this feature is utilized, the "specialEvent" bullet (output above) can -## likely be commented out from the impactSevereThunderstormWarning.xml file +## likely be commented out from the impactSpecialMarineWarning.xml file #parse("dssEvents.vm") ##################### @@ -430,46 +432,46 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS... ${ashfallCTA} #if(${list.contains(${bullets}, "genericCTA")}) -#if(${stormType} == "line") -AS THUNDERSTORMS MOVE OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THESE STORMS PASS. +MOVE TO SAFE HARBOR UNTIL HAZARDOUS WEATHER PASSES. -#else -AS THIS THUNDERSTORM MOVES OVER THE WATER...BOATERS CAN EXPECT GUSTY WINDS AND HIGH WAVES. MOVE TO SAFE HARBOR OR STAY CLOSE TO SHORE UNTIL THE STORM PASSES. - -#end #end #if(${list.contains(${bullets}, "gustyWindsCTA")}) -#if(${stormType} == "line") -MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. +MOVE TO SAFE HARBOR IMMEDIATELY AS GUSTY WINDS AND HIGH WAVES ARE EXPECTED. -#else -MARINERS CAN EXPECT GUSTY WINDS...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. - -#end #end #if(${list.contains(${bullets}, "hailWindsCTA")}) #if(${stormType} == "line") -MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. +BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THESE STORMS PASS. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THESE STORMS. #else -MARINERS CAN EXPECT ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAINS. BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. +BOATERS SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THIS STORM PASSES. ${windCTA}${hailCTA}...HIGH WAVES...DANGEROUS LIGHTNING...AND HEAVY RAIN ARE POSSIBLE WITH THIS STORM. #end #end #if(${list.contains(${bullets}, "nonThunderstormCTA")}) -MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES. BOATERS...ESPECIALLY THOSE UNDER SAIL...SHOULD SEEK SAFE HARBOR IMMEDIATELY...UNTIL THE HIGH WINDS SUBSIDE. +SEEK SAFE SHELTER...MARINERS CAN EXPECT GUSTY WINDS...AND INCREASING WAVES. #end #if(${list.contains(${bullets}, "waterspoutCTA")}) +#if(${list.contains(${bullets}, "thunderstorm")}) THUNDERSTORMS CAN PRODUCE SUDDEN WATERSPOUTS. WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY. +#else +WATERSPOUTS CAN EASILY OVERTURN BOATS AND CREATE LOCALLY HAZARDOUS SEAS. SEEK SAFE HARBOR IMMEDIATELY. + +#end #end #if(${list.contains(${bullets}, "lightningCTA")}) +#if(${stormType} == "line") +FREQUENT LIGHTNING IS OCCURRING WITH THESE STORMS. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS. + +#else FREQUENT LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY BELOW DECK IF POSSIBLE...KEEP AWAY FROM UNGROUNDED METAL OBJECTS. +#end #end #if(${list.contains(${bullets}, "reportCTA")}) -REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE. +REPORT SEVERE WEATHER TO THE NATIONAL WEATHER SERVICE OFFICE. #end #if(${ctaSelected} == "YES") diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.xml b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.xml index ae6317efd2..e480adcb15 100755 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.xml +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/impactSpecialMarineWarning.xml @@ -5,6 +5,7 @@ Note: Volcano information will not show up in the GUI unless uncommented out Phil Kurimski 09-19-2013 added geospatialConfig.xml Phil Kurimski 06-26-2014 added DSS Events + Phil Kurimski 02-18-2015 Updated CTA section -->