From 94d78ed0107477beab29661d42b0346553b928a6 Mon Sep 17 00:00:00 2001 From: David Friedman Date: Wed, 10 Sep 2014 19:25:55 +0000 Subject: [PATCH 1/2] ASM #16730 - WarnGen Watch wording error when issuing product only over Marine Locations Change-Id: I361a1635cf11f3c66801f33c74034028b3e0271d Former-commit-id: bed361fe355ad1b2a4f2ce1ad421808fc275f932 [formerly 17d27fca04fb733d74e5bac99bfed3112bd81b6c] Former-commit-id: 8d7ba120a299b6849467ccfac99e260830ccc2ff --- .../src/com/raytheon/viz/warngen/gui/WarngenLayer.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 a7f370f6ff..39fd777199 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 @@ -213,6 +213,7 @@ import com.vividsolutions.jts.io.WKTReader; * 07/28/2014 DR 17475 Qinglu Lin Updated populateStrings() and findLargestQuadrant(), removed findLargestGeometry(), * added createAreaAndCentroidMaps() and movePopulatePt(), updated paintText() to center W. * 08/20/2014 ASM #16703 D. Friedman Make geo feature types for watches explicit + * 09/10/2014 ASM #16730 D. Friedman Fix NPE. * * * @author mschenke @@ -340,9 +341,11 @@ public class WarngenLayer extends AbstractStormTrackResource { private Set getAllFipsInArea(Geometry warningArea) { Set fipsIds = new HashSet(); - for (int n = 0; n < warningArea.getNumGeometries(); ++n) { - Geometry area = warningArea.getGeometryN(n); - fipsIds.add(getFips(area)); + if (warningArea != null) { + for (int n = 0; n < warningArea.getNumGeometries(); ++n) { + Geometry area = warningArea.getGeometryN(n); + fipsIds.add(getFips(area)); + } } return fipsIds; } From 4bce4db9ef750808c483b89e0f7dc040c09473a2 Mon Sep 17 00:00:00 2001 From: "Qinglu.Lin" Date: Tue, 16 Sep 2014 17:38:56 -0400 Subject: [PATCH 2/2] ASM #15551 - WarnGen: only WCN should be used while including TOR/SVR watches in WarnGen products Change-Id: Ia4350f8c17166c8f972779f8bde1763ec4cd3bd5 Former-commit-id: 5e939996624113de5d9bf41462166ee806099fc0 [formerly e7ab29fbfebb1943e0b0702547dbd353367e797d] Former-commit-id: 0e2be5afd8733354e555db3dad7da1cdffb2e65d --- .../raytheon/viz/warngen/gis/WatchUtil.java | 40 +++++++++- .../viz/warngen/template/TemplateRunner.java | 34 +------- .../com/raytheon/viz/warnings/DateUtil.java | 25 ++++++ .../base/warngen/VM_global_library.vm | 80 ++++++++++++------- 4 files changed, 115 insertions(+), 64 deletions(-) diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/WatchUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/WatchUtil.java index 8f700283b7..47576f5339 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/WatchUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/WatchUtil.java @@ -78,6 +78,8 @@ import com.vividsolutions.jts.geom.Polygon; * Aug 28, 2014 ASM #15658 D. Friedman Add marine zones. * Aug 29, 2014 ASM #15551 Qinglu Lin Sort watches by ETN and filter out ActiveTableRecord * with act of CAN and EXP in processRecords(). + * Sep 12, 2014 ASM #15551 Qinglu Lin Prevent a county's WOU from being used while its + * corresponding WCN is canceled or expired. * * * @@ -307,6 +309,8 @@ public class WatchUtil { InstantiationException { List records = new ArrayList( response.getNumResults()); + Map, Set> removedUgczones = new HashMap, Set>(); + Set ugczones = null; for (Map result : response.getResults()) { WarningAction action = WarningAction.valueOf(String.valueOf(result .get(ACTION))); @@ -316,7 +320,7 @@ public class WatchUtil { * fixed the underlying system. request.addConstraint("act", new * RequestConstraint("CAN", ConstraintType.NOT_EQUALS)); */ - if (action != WarningAction.CAN || action != WarningAction.EXP) { + if (action != WarningAction.CAN && action != WarningAction.EXP) { ActiveTableRecord record = entityClass.newInstance(); record.setIssueTime((Calendar) result.get(ISSUE_TIME_FIELD)); record.setStartTime((Calendar) result.get(START_TIME_FIELD)); @@ -327,6 +331,37 @@ public class WatchUtil { record.setEtn(String.valueOf(result.get(ETN))); record.setAct(String.valueOf(result.get(ACTION))); records.add(record); + } else { + Pair key = new Pair(null, null); + key.setFirst(String.valueOf(result.get(ETN))); + key.setSecond(String.valueOf(result.get(PHEN_SIG_FIELD))); + ugczones = removedUgczones.get(key); + if (ugczones == null) { + ugczones = new HashSet(); + } + ugczones.add(String.valueOf(result.get(UGC_ZONE_FIELD))); + removedUgczones.put(key, ugczones); + } + } + + // remove ActiveTableRecord from records whose etn, ugcZone, and phensig is same as + // canceled or expired. + String etn, ugczone, phensig; + for (Pair etnPhensig: removedUgczones.keySet()) { + ugczones = removedUgczones.get(etnPhensig); + etn = etnPhensig.getFirst(); + phensig = etnPhensig.getSecond(); + Iterator iter = ugczones.iterator(); + while (iter.hasNext()) { + ugczone = iter.next(); + Iterator iterator = records.iterator(); + while (iterator.hasNext()) { + ActiveTableRecord atr = iterator.next(); + if (atr.getEtn().equals(etn) && atr.getUgcZone().equals(ugczone) && + atr.getPhensig().equals(phensig)) { + iterator.remove(); + } + } } } @@ -361,9 +396,6 @@ public class WatchUtil { Map> map = new HashMap>(); // For each watch event, get the end time and list of active zones for (ActiveTableRecord ar : activeTableRecords) { - if (ar.getAct().equals("CAN") || ar.getAct().equals("EXP")) { - continue; - } /* * Currently reports all zones in the watch even if a given zone is * not in the warning polygon. If the logic is changed to only show diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java index 9373221c0b..069853bc96 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java @@ -141,8 +141,6 @@ import com.vividsolutions.jts.io.WKTReader; * added determineAffectedMarinePortions(). * Jul 21, 2014 3419 jsanchez Refactored WatchUtil. * Aug 15, 2014 DR15701 mgamazaychikov Removed static field watchUtil. - * Aug 28, 2014 ASM #15551 Qinglu Lin Replaced 1200 PM/1200 AM by NOON/MIDNIGHT, removed days in - * included tornado/severe thunderstorm watch message. * * * @author njensen @@ -874,37 +872,7 @@ public class TemplateRunner { System.out.println("velocity time: " + (System.currentTimeMillis() - tz0)); - String watches[] = {"TORNADO WATCH", "SEVERE THUNDERSTORM WATCH"}; - int index1 = -1, index2 = -1, index1ToUse = -1; - String doubleDollar = "$$"; - boolean firstTime = true; - for (String s: watches) { - index1 = script.indexOf(s, 0); - if (index1 > 0) { - index2 = script.indexOf(doubleDollar, index1); - } - if (firstTime && index1 > -1) { - index1ToUse = index1; - firstTime = false; - } - } - String days[] = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"}; - String substring = "", text; - if (index1ToUse > -1 && index2 > -1) { - substring = script.substring(index1ToUse, index2).toUpperCase(); - // remove day - for (String day: days) { - substring = substring.replaceAll(day + " ", ""); - } - // replace 1200 PM/1200 AM with NOON/MIDNIGHT - substring = substring.replaceAll("1200 PM", "NOON"); - substring = substring.replaceAll("1200 AM", "MIDNIGHT"); - // concatenate strings - text = script.substring(0, index1ToUse - 1); - text = text + " " + substring + script.substring(index2, script.length()); - } else { - text = script.toString(); - } + String text = script.toString(); WarningTextHandler handler = WarningTextHandlerFactory.getHandler( selectedAction, text, config.getAutoLockText()); String handledText = handler.handle(text, areas, cancelareas, diff --git a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/DateUtil.java b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/DateUtil.java index e14887fd5c..13a31aa025 100644 --- a/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/DateUtil.java +++ b/cave/com.raytheon.viz.warnings/src/com/raytheon/viz/warnings/DateUtil.java @@ -37,6 +37,7 @@ import com.raytheon.viz.texteditor.TextWarningConstants; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 06182008 bwoodle additional format method overloads, javadocs. + * Sep 12, 2014 ASM RM#15551 Qinglu Lin Added formatUseNoonMidnight(). * * * @@ -45,6 +46,8 @@ import com.raytheon.viz.texteditor.TextWarningConstants; */ public class DateUtil { + Pattern timePtrn = Pattern.compile("(1200\\s(AM|PM))"); + /** * Format a date for the severe weather warnings templates * @@ -107,6 +110,28 @@ public class DateUtil { return str; } + public String formatUseNoonMidnight(Date date, DateFormat format, int interval, String tz) { + return formatUseNoonMidnight(date, format, interval, getTimeZoneFromString(tz)); + } + + public String formatUseNoonMidnight(Date date, DateFormat format, int interval, TimeZone tz) { + String str; + Date workingDate = date; + if (interval > 0) { + workingDate = roundDate(date, interval); + } + synchronized (format) { + format.setTimeZone(tz); + str = format.format(workingDate); + } + Matcher m = timePtrn.matcher(str); + if(m.find()) { + str = str.replace("1200 AM", "MIDNIGHT"); + str = str.replace("1200 PM", "NOON"); + } + return str; + } + /** * Format a date for the severe weather warnings templates * diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/VM_global_library.vm b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/VM_global_library.vm index baed0cfbbd..38832a828e 100755 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/VM_global_library.vm +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/utility/common_static/base/warngen/VM_global_library.vm @@ -13,7 +13,7 @@ ##### Qinglu Lin 03-17-2014 DR 16309. Updated inserttorwatches and insertsvrwatches. ##### Qinglu Lin 05-21-2014 DR 16309. Updated inserttorwatches and insertsvrwatches by changing 'FOR##' to 'FOR ##'. ##### D. Friedman 08-28-2014 ASM #15658. Add marine watch wording. -##### Qinglu Lin 08-29-2014 ASM #15551. Overhauled inserttorwatches and insertsvrwatches. +##### Qinglu Lin 09-15-2014 ASM #15551. Overhauled inserttorwatches and insertsvrwatches, added until. #################################################################################################### #* Mile Marker Test Code @@ -200,25 +200,35 @@ ${drainage.name}## #end #end +#set($etns = []) +#set($lastTime = "") +#set($currTime = "") #set($lastEtn = "") -#set($lastEndTime = "") +#set($count = 0) #foreach(${watch} in ${tornadoWatches}) -#if($lastEtn != "" && ${watch.etn} != ${lastEtn}) +#set($success = $etns.add(${watch.etn})) +#end +#foreach(${watch} in ${tornadoWatches}) +#set($count = $count + 1) +#if(${lastEtn} != "" && ${watch.etn} != ${lastEtn}) . ## #end #set($endTime = ${watch.endTime}) -#if(${watch.etn} == ${lastEtn}) -#if(${endTime} == ${lastEndTime}) -...## -#else -...UNTIL ${dateUtil.format(${endTime}, ${timeFormat.plain}, 15, ${localtimezone})} FOR ## -#end -#else -A TORNADO WATCH${ALSO} REMAINS IN EFFECT UNTIL ${dateUtil.format(${endTime}, ${timeFormat.plain}, 15, ${localtimezone})} FOR ## +#if(${watch.etn} != ${lastEtn}) +#set($lastTime = "#until(${endTime}, ${timeFormat}, ${secondtimezone}, ${watch})") +A TORNADO WATCH${ALSO} REMAINS IN EFFECT ${lastTime}## #set($ALSO = " ALSO") +#else +#if(!$foreach.hasNext() || ${watch.etn} != $etns.get(${count})) + AND ## +#else +...## +#end +#set($currTime = "#until(${endTime}, ${timeFormat}, ${secondtimezone}, ${watch})") +#if(${currTime} != ${lastTime}) +${currTime}## +#set($lastTime = ${currTime}) #end -#if(${secondtimezone}) -/${dateUtil.format(${watch.getEndTime()}, ${timeFormat.plain}, 15, ${secondtimezone})}/## #end #if(!${watch.marineAreas}) #areaFormat(${watch.partOfState} true false true)${watch.state}## @@ -226,7 +236,6 @@ A TORNADO WATCH${ALSO} REMAINS IN EFFECT UNTIL ${dateUtil.format(${endTime}, ${t #formatMarineAreas(${watch.marineAreas}) #end #set($lastEtn = ${watch.etn}) -#set($lastEndTime = ${watch.endTime}) #end #if(${lastEtn} != "") . @@ -234,6 +243,14 @@ A TORNADO WATCH${ALSO} REMAINS IN EFFECT UNTIL ${dateUtil.format(${endTime}, ${t #end ########END MACRO +#macro(until $endTime $timeFormat $secondtimezone $watch) +UNTIL ${dateUtil.formatUseNoonMidnight(${endTime}, ${timeFormat.clock}, 15, ${localtimezone})}## +#if(${secondtimezone}) +/${dateUtil.formatUseNoonMidnight(${watch.getEndTime()}, ${timeFormat.clock}, 15, ${secondtimezone})}/## +#end + FOR ## +#end + #macro(insertsvrwatches $watches $list $secondtimezone $dateUtil $timeFormat) #set($svrWatches = []) #set($ALSO = "") @@ -244,25 +261,35 @@ A TORNADO WATCH${ALSO} REMAINS IN EFFECT UNTIL ${dateUtil.format(${endTime}, ${t #end #end +#set($etns = []) +#set($lastTime = "") +#set($currTime = "") #set($lastEtn = "") -#set($lastEndTime = "") +#set($count = 0) #foreach(${watch} in ${svrWatches}) -#if($lastEtn != "" && ${watch.etn} != ${lastEtn}) +#set($success = $etns.add(${watch.etn})) +#end +#foreach(${watch} in ${svrWatches}) +#set($count = $count + 1) +#if(${lastEtn} != "" && ${watch.etn} != ${lastEtn}) . ## #end #set($endTime = ${watch.endTime}) -#if(${watch.etn} == ${lastEtn}) -#if(${endTime} == ${lastEndTime}) -...## -#else -...UNTIL ${dateUtil.format(${endTime}, ${timeFormat.plain}, 15, ${localtimezone})} FOR ## -#end -#else -A SEVERE THUNDERSTORM WATCH${ALSO} REMAINS IN EFFECT UNTIL ${dateUtil.format(${endTime}, ${timeFormat.plain}, 15, ${localtimezone})} FOR ## +#if(${watch.etn} != ${lastEtn}) +#set($lastTime = "#until(${endTime}, ${timeFormat}, ${secondtimezone}, ${watch})") +A SEVERE THUNDERSTORM WATCH${ALSO} REMAINS IN EFFECT ${lastTime}## #set($ALSO = " ALSO") +#else +#if(!$foreach.hasNext() || ${watch.etn} != $etns.get(${count})) + AND ## +#else +...## +#end +#set($currTime = "#until(${endTime}, ${timeFormat}, ${secondtimezone}, ${watch})") +#if(${currTime} != ${lastTime}) +${currTime}## +#set($lastTime = ${currTime}) #end -#if(${secondtimezone}) -/${dateUtil.format(${watch.getEndTime()}, ${timeFormat.plain}, 15, ${secondtimezone})}/## #end #if(!${watch.marineAreas}) #areaFormat(${watch.partOfState} true false true)${watch.state}## @@ -270,7 +297,6 @@ A SEVERE THUNDERSTORM WATCH${ALSO} REMAINS IN EFFECT UNTIL ${dateUtil.format(${e #formatMarineAreas(${watch.marineAreas}) #end #set($lastEtn = ${watch.etn}) -#set($lastEndTime = ${watch.endTime}) #end #if(${lastEtn} != "") .