* diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AviationDialog.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AviationDialog.java index 1740ac1a6a..4bbbc155c2 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AviationDialog.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AviationDialog.java @@ -65,7 +65,7 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; /** - * Aviation Dialog class. + * The Aviation Dialog class that displays the start up menu for AvnFPS. * ** diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigComponent.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigComponent.java index 99bd71b61f..7705310969 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigComponent.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigComponent.java @@ -25,7 +25,7 @@ import org.eclipse.swt.widgets.Shell; import com.raytheon.viz.ui.personalities.awips.AbstractCAVEComponent; /** - * TODO Add Description + * This class is a run configuration component to launch the AvnFPS monitor. * ** diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigDlg.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigDlg.java index 9049c02642..fb317c28f6 100755 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigDlg.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/AvnconfigDlg.java @@ -44,9 +44,9 @@ import com.raytheon.viz.avnconfig.TafSiteInfoEditorDlg; import com.raytheon.viz.avnconfig.TextEditorSetupDlg; /** - * This is the main AvnFPS setup dialog containing the controls to launch the - * Text Editor, Monitoring Rules, TAF Site Info, TAF Products, or Triggers - * dialog. + * This class is the main AvnFPS configuration dialog. It contains the controls + * to launch the Text Editor, Monitoring Rules, TAF Site Info, TAF Products, or + * Climate Data dialogs. * ** SOFTWARE HISTORY @@ -79,14 +79,29 @@ public class AvnconfigDlg extends Dialog { @SuppressWarnings("unused") private MessageStatusComp msgStatusComp; + /** + * Text Editor dialog. + */ private TextEditorSetupDlg editorDlg; + /** + * Monitoring Rules Dialog, + */ private MonitoringCriteriaDlg monCriteriaDlg; + /** + * TAF Site Information dialog. + */ private TafSiteInfoEditorDlg siteInfoDlg; + /** + * TAF Product dialog. + */ private TafProductConfigDlg productsDlg; + /** + * Climate Data dialog. + */ private ClimateDataMenuDlg climateDataDlg; /** @@ -100,7 +115,7 @@ public class AvnconfigDlg extends Dialog { } /** - * Open method used to display the dialog. + * Open method used set up components and display the dialog. * * @return Null. */ @@ -344,19 +359,6 @@ public class AvnconfigDlg extends Dialog { } }); - // The Triggers dialog is no longer needed. - // gd = new GridData(buttonWidth, SWT.DEFAULT); - // Button triggersBtn = new Button(buttonComp, SWT.PUSH); - // triggersBtn.setText("Triggers"); - // triggersBtn.setLayoutData(gd); - // triggersBtn.addSelectionListener(new SelectionAdapter() { - // @Override - // public void widgetSelected(SelectionEvent event) { - // TriggerEditorDlg triggerDlg = new TriggerEditorDlg(shell); - // triggerDlg.open(); - // } - // }); - gd = new GridData(buttonWidth, SWT.DEFAULT); Button climateBtn = new Button(buttonComp, SWT.PUSH); climateBtn.setText("Climate Data"); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistAction.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistAction.java index aa67f27dc7..40355c90e9 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistAction.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistAction.java @@ -37,7 +37,8 @@ import com.raytheon.viz.avncommon.AvnMessageMgr.StatusMessageType; import com.raytheon.viz.avnconfig.TafSiteConfigFactory; /** - * TODO Add Description + * This class is a handler for bring up the Ceiling/Visibility Distribution + * dialog. * ** @@ -52,7 +53,9 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; * @author mnash * @version 1.0 */ - +@Deprecated +// No long used @see com.raytheon.viz.aviation.CigVisDistComponent +// TODO remove from base line. public class CigVisDistAction extends AbstractHandler { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(CigVisDistAction.class); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistComponent.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistComponent.java index 4241415e97..524178e1de 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistComponent.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisDistComponent.java @@ -30,7 +30,7 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; import com.raytheon.viz.ui.personalities.awips.AbstractCAVEComponent; /** - * TODO Add Description + * This is a component class for launching the CigVisDistributionDlg dialog. * ** diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendAction.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendAction.java index f2d09860fe..c051756c50 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendAction.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendAction.java @@ -37,7 +37,7 @@ import com.raytheon.viz.avncommon.AvnMessageMgr.StatusMessageType; import com.raytheon.viz.avnconfig.TafSiteConfigFactory; /** - * TODO Add Description + * Action class for launching the Ceiling/Visibility Trend dialog. * ** @@ -52,7 +52,8 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; * @author mnash * @version 1.0 */ - +@Deprecated +// TODO no longer used remove from the base line public class CigVisTrendAction extends AbstractHandler { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(CigVisTrendAction.class); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendComponent.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendComponent.java index 0a4c757ea7..d347159d97 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendComponent.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/CigVisTrendComponent.java @@ -30,7 +30,7 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; import com.raytheon.viz.ui.personalities.awips.AbstractCAVEComponent; /** - * TODO Add Description + * This is a component class for lanuching the CigVisTrendDlg dialog. * ** diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarAction.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarAction.java index f541a594d8..cce598d81f 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarAction.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarAction.java @@ -37,7 +37,7 @@ import com.raytheon.viz.avncommon.AvnMessageMgr.StatusMessageType; import com.raytheon.viz.avnconfig.TafSiteConfigFactory; /** - * TODO Add Description + * Action class for the Climate's METAR Display. * ** @@ -52,7 +52,8 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; * @author mnash * @version 1.0 */ - +@Deprecated +// TODO no longer used remove from the base line public class MetarAction extends AbstractHandler { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(MetarAction.class); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarComponent.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarComponent.java index 4ca269fa8f..fcc57f0100 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarComponent.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/MetarComponent.java @@ -30,7 +30,7 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; import com.raytheon.viz.ui.personalities.awips.AbstractCAVEComponent; /** - * TODO Add Description + * This is a component class for launching the Climate's MetarDisplayDialog. * ** @@ -548,12 +559,12 @@ public class TopoQuery implements ITopoQuery { double[] crsCorners = new double[worldCorners.length]; GeneralEnvelope env = new GeneralEnvelope(2); if (worldCorners[2] > worldGeomPM.getGridRange().getHigh(0) + 1) { - worldGeomDL.getGridToCRS().transform(worldCorners, 0, + worldGeomDL.getGridToCRS(PixelInCell.CELL_CORNER).transform(worldCorners, 0, crsCorners, 0, worldCorners.length / 2); env.setCoordinateReferenceSystem(worldGeomDL.getEnvelope() .getCoordinateReferenceSystem()); } else { - worldGeomPM.getGridToCRS().transform(worldCorners, 0, + worldGeomPM.getGridToCRS(PixelInCell.CELL_CORNER).transform(worldCorners, 0, crsCorners, 0, worldCorners.length / 2); env.setCoordinateReferenceSystem(worldGeomPM.getEnvelope() .getCoordinateReferenceSystem()); @@ -711,16 +722,104 @@ public class TopoQuery implements ITopoQuery { GridCoverageFactory factory = new GridCoverageFactory(); GridCoverage2D baseGC = factory.create("", topoValues, env); - GridCoverage2D gridCov = MapUtil.reprojectCoverage(baseGC, - targetGeom.getCoordinateReferenceSystem(), targetGeom, - Interpolation.getInstance(Interpolation.INTERP_BICUBIC)); + return simpleResample(baseGC, topoValues, targetGeom); + } + + float[] simpleResample(GridCoverage2D sourceGC, float[][] sourceData, GridGeometry2D targetGG) { + int sourceWidth = sourceGC.getGridGeometry().getGridRange2D().getSpan(0); + int sourceHeight = sourceGC.getGridGeometry().getGridRange2D().getSpan(1); + int targetWidth = targetGG.getGridRange2D().getSpan(0); + int targetHeight = targetGG.getGridRange2D().getSpan(1); + float[] output = new float[targetWidth * targetHeight]; + Arrays.fill(output, Float.NaN); - Raster data = gridCov.getRenderedImage().getData(); - float[] f1 = null; - f1 = data.getPixels(data.getMinX(), data.getMinY(), data.getWidth(), - data.getHeight(), f1); + ArrayList* diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseAction.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseAction.java index 83f3a0c590..fbf00c8235 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseAction.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseAction.java @@ -37,7 +37,7 @@ import com.raytheon.viz.avncommon.AvnMessageMgr.StatusMessageType; import com.raytheon.viz.avnconfig.TafSiteConfigFactory; /** - * TODO Add Description + * Action class for Climate's Wind Rose Dialog. * ** * @author dhladky * @version 1.0 + * */ public class MesoCycloneTabularProduct extends RadarProduct { @@ -101,14 +113,11 @@ public class MesoCycloneTabularProduct extends RadarProduct { // populate needed data if (table != null) { - - ArrayList* @@ -52,7 +52,8 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; * @author mnash * @version 1.0 */ - +@Deprecated +// TODO no longer used remove from the base line public class WindRoseAction extends AbstractHandler { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(WindRoseAction.class); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseComponent.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseComponent.java index 82bb46c493..0cf7e54404 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseComponent.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/WindRoseComponent.java @@ -30,7 +30,7 @@ import com.raytheon.viz.avnconfig.TafSiteConfigFactory; import com.raytheon.viz.ui.personalities.awips.AbstractCAVEComponent; /** - * TODO Add Description + * Component class for launching the Climate's WindRoseDlg. * ** @@ -130,6 +133,10 @@ public class CompositeReflectivityProduct extends RadarProduct { ScanTableData* diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/CacheGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/CacheGuidanceRequest.java index 9746d37cea..0f605f729d 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/CacheGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/CacheGuidanceRequest.java @@ -25,7 +25,7 @@ import java.util.Map; import com.raytheon.viz.aviation.guidance.GuidanceRequest; /** - * Guidance request used for caching data. + * The base Guidance Request classed used for caching data. * ** * @author snaples @@ -60,225 +55,62 @@ import com.raytheon.uf.edex.ohd.MainMethod; */ public class HPEDhrSrv { - private static final transient IUFStatusHandler logger = UFStatus - .getHandler(HPEDhrSrv.class); + private Log logger = LogFactory.getLog(getClass()); + + private AppsDefaults appsDefaults = AppsDefaults.getInstance(); + + private CoreDao dao; + + private File outFile; private static final Pattern WMO_PATTERN = Pattern .compile("([A-Z]{4}[0-9]{2} [A-Z]{4} [0-9]{6})\\x0D\\x0D\\x0A(\\w{6})\\x0D\\x0D\\x0A"); - private static final Pattern LDM_PATTERN = Pattern + /** WMO header regex */ + // private static final Pattern wmoPat = Pattern + // .compile("(\\p{Alpha}{4}\\d{2}) (\\p{Alnum}{4}) (\\d{6})"); + + private static final Pattern ldmPat = Pattern .compile("(\\p{Alpha}{3})(\\p{Alpha}{3})"); - private static final Pattern RAD_PATTERN = Pattern + private static final Pattern radPat = Pattern .compile("(\\p{Alpha}{4}).(\\d{2,3}).(\\d{8}_\\d{4})"); - private static final String DHRTYPE = "32"; + private final String DHR = "DHR"; - private static final String DSPTYPE1 = "138"; + private final String dhrtype = "32"; - private static final String DSPTYPE2 = "80"; + private final String dsptype1 = "138"; - private static final String DHR = "DHR"; + private final String dsptype2 = "80"; - private static final String DSP = "DSP"; + private final String DSP = "DSP"; - private static final String STP = "STP"; + private final String STP = "STP"; - private static final int RADID_IDX = 0; - - private static final int DTYPE_IDX = 1; - - private static final int DT_IDX = 2; - - private static final String JMS_QUEUE_URI = "jms-generic:queue:dhrProcess"; - - private AppsDefaults appsDefaults = AppsDefaults.getInstance(); - - /** - * Route endpoint for "dhrIngestRoute". Takes a message, writes the file to - * disk, and then runs the DHR data processing scripts so the file is - * ingested. - * - * @param message - * A* @@ -50,10 +50,20 @@ public class CacheGuidanceRequest extends GuidanceRequest { return map; } + /** + * The site associated with the request. + * + * @return siteID + */ public String getSiteID() { return this.siteID; } + /** + * Set the site ID associated with the request. + * + * @param siteID + */ public void setSiteID(String siteID) { this.siteID = siteID; } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/GridCacheGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/GridCacheGuidanceRequest.java index b42eae4df7..286ea03653 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/GridCacheGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/GridCacheGuidanceRequest.java @@ -23,7 +23,7 @@ import java.util.HashMap; import java.util.Map; /** - * Guidance request used for caching data. + * Guidance request used for caching Grid data. * ** @@ -1701,6 +1702,7 @@ public class WarngenLayer extends AbstractStormTrackResource { DataTime currentFrameTime, double speed, double motdir) { Coordinate recordDragMePoint = new Coordinate( displayState.dragMePoint.getCoordinate()); + recordDragMePoint = GisUtil.restoreAlaskaLon(recordDragMePoint); long currentInMillis = currentFrameTime.getRefTimeAsCalendar() .getTimeInMillis(); diff --git a/edexOsgi/build.edex/deploy-install.xml b/edexOsgi/build.edex/deploy-install.xml index c7ab5d4b41..3693c00dcd 100644 --- a/edexOsgi/build.edex/deploy-install.xml +++ b/edexOsgi/build.edex/deploy-install.xml @@ -7,9 +7,8 @@* @@ -39,8 +39,15 @@ import java.util.Map; * @version 1.0 */ public class GridCacheGuidanceRequest extends CacheGuidanceRequest { + // TODO remove use the siteID in CacheGuidanceRequest. protected String siteID; + /** + * Build the Grid tag string for desired site. + * + * @param siteID + * @return tag + */ public static String getTag(String siteID) { return GuidanceType.GRID + ":" + siteID; } @@ -52,10 +59,12 @@ public class GridCacheGuidanceRequest extends CacheGuidanceRequest { return map; } + // TODO remove use the one in CacheGuidanceRequest public String getSiteID() { return this.siteID; } + // TODOremove use the one in CacheGuidanceRequest public void setSiteID(String siteID) { this.siteID = siteID; } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MetarCacheGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MetarCacheGuidanceRequest.java index 411ea7e9dd..8f30a56a70 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MetarCacheGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MetarCacheGuidanceRequest.java @@ -23,7 +23,7 @@ import java.util.HashMap; import java.util.Map; /** - * Guidance request used for caching data. + * Guidance request used for caching Metar data. * ** @@ -742,6 +744,7 @@ public class Wx { } Coordinate c = searchArea.getCentroid().getCoordinate(); + c = GisUtil.restoreAlaskaLon(c); CoordinateReferenceSystem crs = MapUtil.constructStereographic( MapUtil.AWIPS_EARTH_RADIUS, MapUtil.AWIPS_EARTH_RADIUS, c.y, c.x); @@ -796,6 +799,7 @@ public class Wx { gc.setStartingGeographicPoint(cp.point.x, cp.point.y); Coordinate cen = distanceGeom.getCentroid() .getCoordinate(); + cen = GisUtil.restoreAlaskaLon(cen); gc.setDestinationGeographicPoint(cen.x, cen.y); cp.azimuth = gc.getAzimuth(); cp.oppositeAzimuth = ClosestPoint 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 234e829a9a..8316e36f4c 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 @@ -135,6 +135,7 @@ import com.vividsolutions.jts.io.WKTReader; * ------------ ---------- ----------- -------------------------- * May 4, 2010 mschenke Initial creation * 02/01/2012 DR 14491 D. Friedman Load/unload only the maps not already loaded + * 02/28/2012 DR 13596 Qinglu Lin Call GisUtil.restoreAlaskaLon() in figurePoint(). * ** @@ -39,10 +39,18 @@ import java.util.Map; * @version 1.0 */ public class MetarCacheGuidanceRequest extends CacheGuidanceRequest { + // TODO remove use the one in CacheGuidanceRequest protected String siteID; protected String size; + /** + * Generate tag based on site ID and METAR size. + * + * @param siteID + * @param size + * @return tag + */ public static String getTag(String siteID, String size) { return GuidanceType.METAR + ":" + siteID + ":" + size; } @@ -55,10 +63,12 @@ public class MetarCacheGuidanceRequest extends CacheGuidanceRequest { return map; } + // TODO remove use the one in CacheGuidanceRequest public String getSiteID() { return this.siteID; } + // TODO remove use the one in CacheGuidanceRequest public void setSiteID(String siteID) { this.siteID = siteID; } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MosCacheGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MosCacheGuidanceRequest.java index e9a3604a64..5273d065e3 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MosCacheGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/MosCacheGuidanceRequest.java @@ -26,7 +26,7 @@ import java.util.Map; import com.raytheon.uf.common.time.DataTime; /** - * Guidance request used for caching data. + * Guidance request used for caching MOS data. * ** * @author chammack @@ -267,4 +268,24 @@ public class GisUtil { return Arrays.equals(old, neww); } + /** + * restoreAlaskaLon() + * + * Feb 28, 2012 DR13596 Qinglu Lin Created. + * + * If the longitude of a Coordinate is less than -180 and corresponding + * latitude is larger than 45 degree North, convert it to a value + * equivalent to (360 + the longitude). + */ + public static Coordinate restoreAlaskaLon(Coordinate oldCoords) { + Coordinate coord = new Coordinate(); + if (oldCoords.x < -180. && oldCoords.y > 45.) { + coord.x = 360. + oldCoords.x; + } else { + coord.x = oldCoords.x; + } + coord.y = oldCoords.y; + return coord; + } + } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java index 9fe3c76a63..3767788c94 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/Wx.java @@ -88,6 +88,8 @@ import com.vividsolutions.jts.geom.Point; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 1, 2007 chammack Initial Creation. + * Mar 01, 2012 DR13596 Qinglu Lin Call GisUtil.restoreAlaskaLon() + * in getClosestPoints(). * ** @@ -42,20 +42,34 @@ import com.raytheon.uf.common.time.DataTime; * @version 1.0 */ public class MosCacheGuidanceRequest extends CacheGuidanceRequest { + // TODO remove use the one in CacheGuidanceRequest protected String siteID; + /** + * The Reference time can be null for the current time. + */ protected Date refTime; /** + * Get MOS tag for give site ID, model and the current time as the reference + * time. + * * @param siteID * @param model - * @param format - * @return + * @return tag */ public static String getTag(String siteID, String model) { return getTag(siteID, model, "current"); } + /** + * Get MOS tag based on site ID, model and reference time. + * + * @param siteID + * @param model + * @param refTime + * @return tag + */ public static String getTag(String siteID, String model, String refTime) { return model + ":" + siteID + ":" + refTime; } @@ -72,10 +86,12 @@ public class MosCacheGuidanceRequest extends CacheGuidanceRequest { return map; } + // TODO remove use the one in CacheGuidanceRequest public String getSiteID() { return this.siteID; } + // TODO remove use the one in CacheGuidanceRequest public void setSiteID(String siteID) { this.siteID = siteID; } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/PythonCacheGuidanceJob.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/PythonCacheGuidanceJob.java index 1476752237..efc56f858e 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/PythonCacheGuidanceJob.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/PythonCacheGuidanceJob.java @@ -46,7 +46,7 @@ import com.raytheon.viz.aviation.activator.Activator; import com.raytheon.viz.aviation.monitor.AvnPyUtil; /** - * TODO Add Description + * Class to handle the cache data jobs. * ** @@ -146,17 +147,23 @@ public class AlarmAlertFunctions { for(AlarmAlertProduct p : prods) { String search = p.getSearchString(); + boolean match = false; if((search != null) && (search.length() > 0)) { if(s.indexOf(search) >= 0) { - if ("Alarm".equals(p.getAlarmType()) && p.isAlarm()) { - alarm = true; - } - productFound = p; - break; + match = true; } } else { - productFound = p; - break; + match = true; + } + if (match) { + if (productFound == null) + productFound = p; + if ("Alarm".equals(p.getAlarmType()) && p.isAlarm()) { + alarm = true; + productFound = p; + } + if (alarm) + break; } } } diff --git a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java index a00feaae54..b78c9f4afb 100644 --- a/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java +++ b/cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gis/GisUtil.java @@ -55,6 +55,7 @@ import com.vividsolutions.jts.geom.Polygon; * convert longitudes for Alaska when * they're in Eastern Hemisphere; invoke * it in convertCoords(). + * Feb 29, 2012 #13596 Qinglu Lin Added restoreAlaskaLon(). ** @@ -101,8 +101,14 @@ public class PythonCacheGuidanceJob extends */ private Object waitMonitor; + /** + * Object to synchronize suspending/restarting the instance of this class. + */ private Object suspendMonitor; + /** + * True when job suspended otherwise false. + */ boolean suspendJob; /** @@ -161,12 +167,18 @@ public class PythonCacheGuidanceJob extends instance = null; } + /** + * Indicate the jobs is to be suspended. + */ public static final void suspend() { if (instance != null) { instance.suspendJob = true; } } + /** + * Notify the job it can resume working. + */ public void restart() { synchronized (instance.suspendMonitor) { instance.suspendJob = false; @@ -174,6 +186,10 @@ public class PythonCacheGuidanceJob extends } } + /** + * Setup listener to clean up the instance of this class and any threads it + * is running. + */ private void setupDispose() { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() .addDisposeListener(new DisposeListener() { @@ -300,6 +316,13 @@ public class PythonCacheGuidanceJob extends } } + /** + * Clear desired tags for sites. + * + * @param tags + * A map with key of stites an array of tags to clear for the + * site + */ public synchronized void clearSiteObjs(Map* * @author mnash @@ -178,7 +179,13 @@ public class AlarmAlertBell extends Dialog implements MouseMoveListener, public Object open(boolean alarm) { // setInitialDialogLocation(); - if (alarmShell.isVisible()) { + if (alarm) { + // provides the beep to alert the user that an alarm has come in + abj = new AlarmBeepJob("AlarmBeepJob"); + abj.schedule(); + } + + if (alarmShell != null && alarmShell.isVisible()) { alarmShell.setVisible(true); } else { display = parentShell.getDisplay(); @@ -187,23 +194,21 @@ public class AlarmAlertBell extends Dialog implements MouseMoveListener, } alarmShell.setLocation(locationX, locationY); - if (alarm) { - // provides the beep to alert the user that an alarm has come in - abj = new AlarmBeepJob("AlarmBeepJob"); - abj.schedule(); - } - alarmShell.pack(); alarmShell.setVisible(true); alarmShell.setActive(); + /* // TODO: what is this for? while (!alarmShell.isDisposed()) { if (!display.isDisposed() && !display.readAndDispatch()) { display.sleep(); } } + */ + /*// TODO: put this in the correct location. labelFont.dispose(); + */ } return null; diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/util/AlarmAlertFunctions.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/util/AlarmAlertFunctions.java index 31c3e970c1..8b1290ff2a 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/util/AlarmAlertFunctions.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/util/AlarmAlertFunctions.java @@ -62,7 +62,8 @@ import com.raytheon.viz.texteditor.util.TextEditorUtil; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Sep 18, 2009 mnash Initial creation + * Sep 18, 2009 mnash Initial creation + * 03/19/2012 D. Friedman Fix determination of "Alarm" entries. * *> tags) { for (Object s : tags.keySet().toArray()) { String siteID = s.toString(); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/TampCacheGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/TampCacheGuidanceRequest.java index c5b596e816..c09d219839 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/TampCacheGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/cachedata/TampCacheGuidanceRequest.java @@ -23,7 +23,7 @@ import java.util.HashMap; import java.util.Map; /** - * Guidance request used for caching data. + * Guidance request used for caching Tamp data. * * * @@ -39,8 +39,16 @@ import java.util.Map; * @version 1.0 */ public class TampCacheGuidanceRequest extends CacheGuidanceRequest { + // TODO remove use the one in CacheGuidanceRequest protected String siteID; + /** + * Get TAMP tag based on site ID and model. + * + * @param siteID + * @param model + * @return tag + */ public static String getTag(String siteID, String model) { return model + ":" + siteID; } @@ -53,10 +61,12 @@ public class TampCacheGuidanceRequest extends CacheGuidanceRequest { return map; } + // TODO remove use the one in CacheGuidanceRequest public String getSiteID() { return this.siteID; } + // TODO remove use the one in CacheGuidanceRequest public void setSiteID(String siteID) { this.siteID = siteID; } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/EtaViewer.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/EtaViewer.java index 8282f61ef5..a0f7f325cb 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/EtaViewer.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/EtaViewer.java @@ -97,6 +97,11 @@ public class EtaViewer extends ViewerTab implements */ private List* @@ -169,7 +170,7 @@ public class RadarSRMResource extends RadarRadialResource implements } if (srmSource.equals(SRMSource.STI)) { sourceName = "STI"; - StormTrackData stormTrackData = RadarHelper.getSTIData(icao); + StormTrackData stormTrackData = RadarHelper.getSTIDataForRadarRecord(record); if (stormTrackData != null && stormTrackData.isValid()) { direction = stormTrackData.getMotionDirection(); speed = stormTrackData.getMotionSpeed(); diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/StationUtils.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/StationUtils.java index ce54b73362..f60fa5174a 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/StationUtils.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/util/StationUtils.java @@ -73,27 +73,29 @@ public class StationUtils implements IToolChangedListener { // String site = lm.getCurrentSite(); Coordinate home = ToolsDataManager.getInstance().getHome(); - double lat = home.y; - double lon = home.x; - - GetRadarSpatialRequest request = new GetRadarSpatialRequest(); - request.setLat(lat); - request.setLon(lon); - try { - Object response = ThriftClient.sendRequest(request); - - if (response != null && response instanceof RadarStation) { - station = (RadarStation) response; - } - } catch (Exception e) { - statusHandler.handle(Priority.PROBLEM, - "Unable to retrieve home radar", e); - } + return getClosestRadarStation(home.x, home.y); } return station; } + public RadarStation getClosestRadarStation(double lon, double lat) { + GetRadarSpatialRequest request = new GetRadarSpatialRequest(); + request.setLat(lat); + request.setLon(lon); + try { + Object response = ThriftClient.sendRequest(request); + + if (response != null && response instanceof RadarStation) { + return (RadarStation) response; + } + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Unable to retrieve home radar", e); + } + return null; + } + /* * (non-Javadoc) * diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java index bd1bb8972f..2f1ef2d00f 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java @@ -63,6 +63,7 @@ import com.raytheon.viz.texteditor.alarmalert.util.AlarmBeepJob; * Sep 21, 2009 mnash Initial creation * Aug 16, 2010 2187 cjeanbap Fixed a NullPointerException * Dec 23, 2010 7375 cjeanbap Force dialog ON TOP of over Dialog/Windows. + * 03/19/2012 D. Friedman Fix alarming. Disable runloop in open(). *stationList; + /** + * The results from the last completed request. Should contain the raw + * header and data information used for highlighting. Keep around for faster + * updates when highlighting options state changes. + */ private String[] currentGuidance; /** @@ -265,6 +270,12 @@ public class EtaViewer extends ViewerTab implements } } + /** + * Request desired data for display on the tab. A check is performed and if + * all data is cached a request is queued to immediately update the tab. + * Otherwise request is made to cache missing data and update the display + * once it arrives. + */ @Override public int generateGuidance(String siteID) { int cnt = super.generateGuidance(siteID); @@ -306,8 +317,6 @@ public class EtaViewer extends ViewerTab implements } else { req.setSiteObjs(siteObjs); req.setRoutine(routineChk.getSelection()); - // textComp.getHeaderStTxt().setText(""); - // textComp.getDataStTxt().setText(""); PythonGuidanceJob.getInstance().enqueue(req); } return cnt; @@ -333,10 +342,23 @@ public class EtaViewer extends ViewerTab implements this.stationList = stationList; } + /** + * Get a tag for current time, site, and the tab's model. + * + * @param siteID + * @return tag + */ private String getTag(String siteID) { return MosCacheGuidanceRequest.getTag(siteID, this.model); } + /** + * This creates a cache request. + * + * @param siteID + * @param format + * @return req + */ private CacheGuidanceRequest createCacheRequest(String siteID, String format) { MosCacheGuidanceRequest req = new MosCacheGuidanceRequest(); req.setTag(getTag(siteID)); @@ -347,6 +369,9 @@ public class EtaViewer extends ViewerTab implements return req; } + /** + * Queue a cache request for the list of sites. + */ @Override public void generateCache(List siteIDs) { for (String siteID : siteIDs) { diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridGuidanceRequest.java index 906125b835..923d5443b2 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridGuidanceRequest.java @@ -49,6 +49,9 @@ public class GridGuidanceRequest extends GuidanceRequest { this.siteObjs = siteObjs; } + /** + * Place in the map arguments need for grid. + */ @Override public Map getPythonArguments() { Map map = new HashMap (); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridViewer.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridViewer.java index f3a424c3d2..ed5ae92808 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridViewer.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GridViewer.java @@ -279,6 +279,12 @@ public class GridViewer extends ViewerTab implements } } + /** + * Request desired data for display on the tab. A check is performed and if + * all data is cached a request is queued to immediately update the tab. + * Otherwise request is made to cache missing data and update the display + * once it arrives. + */ @Override public int generateGuidance(String siteID) { int cnt = super.generateGuidance(siteID); @@ -320,8 +326,6 @@ public class GridViewer extends ViewerTab implements } else { req.setSiteObjs(siteObjs); req.setRoutine(routineChk.getSelection()); - // textComp.getHeaderStTxt().setText(""); - // textComp.getDataStTxt().setText(""); PythonGuidanceJob.getInstance().enqueue(req); } return cnt; @@ -347,6 +351,9 @@ public class GridViewer extends ViewerTab implements this.stationList = stationList; } + /** + * Queue a cache request for the list of sites. + */ @Override public void generateCache(List siteIDs) { for (String siteID : siteIDs) { @@ -355,10 +362,22 @@ public class GridViewer extends ViewerTab implements } } + /** + * Get grid style tag for the site ID. + * + * @param siteID + * @return tag + */ private String getTag(String siteID) { return GridCacheGuidanceRequest.getTag(siteID); } + /** + * Create grid cache request. + * + * @param siteID + * @return req + */ private CacheGuidanceRequest createCacheRequest(String siteID) { GridCacheGuidanceRequest req = new GridCacheGuidanceRequest(); req.setTag(getTag(siteID)); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceRequest.java index d47e0b4e24..4a7e35618c 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceRequest.java @@ -26,7 +26,7 @@ import java.util.Map; import com.raytheon.uf.viz.core.jobs.QueueJobRequest; /** - * Basic request to generate guidance + * Basic request to generate a request for the PythonGuidancdJob class. * * * @@ -45,32 +45,75 @@ import com.raytheon.uf.viz.core.jobs.QueueJobRequest; public class GuidanceRequest extends QueueJobRequest* @@ -169,6 +175,11 @@ public class RadarHelper { public static final String[] rdaChannelStr = { "NWS Single Thread", "RDA 1", "RDA 2" }; + /** + * The default maximimum difference in time used when retrieving STI data (15 minutes.) + */ + public static final long DEFAULT_MAX_STI_TIME_DIFFERENCE = 15 * 60 * 1000; + /** * Returns the information in the packet to be processed * @@ -352,4 +363,148 @@ public class RadarHelper { return rval; } + + /** + * Get the STI data for the radar and time specified by the given + * RadarRecord. + * + * @param referenceRecord + * Specifies the radar and time to search for. + * @return The STI data record for the specified radar and closest in time + * to the specified time within + * {@link #DEFAULT_MAX_STI_TIME_DIFFERENCE} or null if there isn't + * any STI data that matches. + * @throws VizException + */ + public static StormTrackData getSTIDataForRadarRecord( + RadarRecord referenceRecord) throws VizException { + return getSTIData(referenceRecord.getIcao(), referenceRecord + .getDataTime().getRefTime(), DEFAULT_MAX_STI_TIME_DIFFERENCE); + } + + private static final SimpleDateFormat DATE_FORMAT; + static { + DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); + } + + /** + * Retrieves the specified STI data. + * + * @param icao + * The ICAO of there radar whose STI data is to be returned + * @param targetTime + * If not null, specifies the center or a time range to search. + * If null, the latest STI product is retrieved + * (TODO: DOES NOT WORK because "order by" is + * ignored by DbQueryHandler.) + * @param maxTimeDifference + * The maximum acceptable difference in time from targetTime, in + * milliseconds. + * @return The STI data or null if there isn't any STI data in the database + * that matches the given criteria + * @throws VizException + */ + public static StormTrackData getSTIData(String icao, Date targetTime, long maxTimeDifference) throws VizException { + StormTrackData rval = null; + Exception exc = null; + try { + RadarRecord record = null; + DbQueryRequest request = new DbQueryRequest(); + request.setEntityClass(RadarRecord.class.getName()); + request.setOrderByField("dataTime.refTime", OrderMode.DESC); + if (targetTime != null) { + if (maxTimeDifference != 0) { + maxTimeDifference = Math.abs(maxTimeDifference); + request.addConstraint("dataTime.refTime", + new RequestConstraint(DATE_FORMAT.format(new Date(targetTime.getTime() - maxTimeDifference)), + ConstraintType.GREATER_THAN_EQUALS)); + request.addConstraint("dataTime.refTime", + new RequestConstraint(DATE_FORMAT.format(new Date(targetTime.getTime() + maxTimeDifference)), + ConstraintType.LESS_THAN_EQUALS)); + RequestConstraint timeConstraint = new RequestConstraint(null, ConstraintType.BETWEEN); + timeConstraint.setBetweenValueList(new String[] { + DATE_FORMAT.format(new Date(targetTime.getTime() - maxTimeDifference)), + DATE_FORMAT.format(new Date(targetTime.getTime() + maxTimeDifference)) + }); + request.addConstraint("dataTime.refTime", timeConstraint); + } else { + request.addConstraint("dataTime.refTime", + new RequestConstraint(DATE_FORMAT.format(targetTime))); + } + } else + request.setLimit(1); + request.addConstraint("productCode", new RequestConstraint("58")); + request.addConstraint("icao", new RequestConstraint(icao)); + request.addConstraint("pluginName", new RequestConstraint("radar")); + + DbQueryResponse response = (DbQueryResponse) ThriftClient + .sendRequest(request); + if (targetTime != null && maxTimeDifference != 0) { + // Find the record closest in time to targetTime. + long bestDifference = Long.MAX_VALUE; + for (Map{ + /** + * This enumeration class defines the various type of guidance request that + * can be received and associates the python method executed to service the + * request. The METAR_CACHE and TAF_CACHE are special types used by + * observer's to inform when new data has arrived and the cache needs to be + * cleared and the new data retrieved. + * + */ public static enum GuidanceType { MOS("tafgen"), TAMP("tampgen"), GRID("gridgen"), ETA("tafgen"), METAR( "metargen"), METAR_CACHE("clearMetarCache"), TAF_CACHE( "clearCache"); + /** + * The python method associated with the enumeration. + */ private String pythonMethod; + /** + * Constructor that associates a python method with the enumerator. + * + * @param pythonMethod + */ private GuidanceType(String pythonMethod) { this.pythonMethod = pythonMethod; } + /** + * Get the enumeatior's python method. + * + * @return pythonMethod + */ public String getPythonMethod() { return pythonMethod; } } + /** + * List of site ID to query for. + */ protected ArrayList siteIDs; + /** + * the model being used. + */ protected String model; + /** + * The format to use. + */ protected String format; + /** + * Type of request. + */ protected GuidanceType guidanceType; + /** + * Tag associated with the request. + */ protected String tag; + /** + * This creates a default map with the mapping of the site IDs, model and + * format. The intent is to pass the map to the python code. This can be + * overriden by subclasses to fulfill the needs of a given python method. + * + * @return map + */ public Map getPythonArguments() { Map map = new HashMap (); map.put("siteIDs", siteIDs); @@ -79,42 +122,92 @@ public class GuidanceRequest extends QueueJobRequest { return map; } + /** + * The list of sites request is for. + * + * @return siteIDs + */ public ArrayList getSiteIDs() { return siteIDs; } + /** + * + * @param siteIDs + * list of sites array request is for + */ public void setSiteIDs(ArrayList siteIDs) { this.siteIDs = siteIDs; } + /** + * The model argument for the request. + * + * @return model + */ public String getModel() { return model; } + /** + * Set the model argument for the request. + * + * @param model + */ public void setModel(String model) { this.model = model; } + /** + * The format argument for the request. + * + * @return format + */ public String getFormat() { return format; } + /** + * Set the format argument for the request. + * + * @param format + */ public void setFormat(String format) { this.format = format; } + /** + * + * @return guidanceType + */ public GuidanceType getGuidanceType() { return guidanceType; } + /** + * Set the guidance type for the request. + * + * @param guidanceType + */ public void setGuidanceType(GuidanceType guidanceType) { this.guidanceType = guidanceType; } + /** + * The tag value for the request. Use to determine if the value has been + * cached. + * + * @return tag + */ public String getTag() { return tag; } + /** + * Set the tag value of the request. + * + * @param tag + */ public void setTag(String tag) { this.tag = tag; } @@ -132,6 +225,8 @@ public class GuidanceRequest extends QueueJobRequest { state = tag.equals(oReq.tag); } } + + // TODO remove debug statement. if (state) { System.out.println("-- GuidanceRequest match tag: " + tag); } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceUtil.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceUtil.java index c9e3ac750f..6cc5b6ec3c 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceUtil.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/GuidanceUtil.java @@ -60,6 +60,8 @@ public class GuidanceUtil { * @return */ @Deprecated + // TODO Remove this method no longer used in java, python of xml + // configuration. public static MetarRecord getLatestMetar(String siteID) { try { Map map = new HashMap (); @@ -82,6 +84,13 @@ public class GuidanceUtil { return null; } + /** + * Get the GFE Point Data information for the task request. + * + * @param task + * @return gfePointDataContainer + * @throws VizException + */ @SuppressWarnings("unchecked") public static GFEPointDataContainer getGFEPointData(GetPointDataRequest task) throws VizException { diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarGuidanceRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarGuidanceRequest.java index a7ac28429e..1eba47bc29 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarGuidanceRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarGuidanceRequest.java @@ -51,6 +51,9 @@ public class MetarGuidanceRequest extends GuidanceRequest { protected ArrayList siteObjs; + /** + * Place in the map arguments need for Metar request. + */ @Override public Map getPythonArguments() { Map map = new HashMap (); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarViewer.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarViewer.java index b0ca628376..886426adc0 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarViewer.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MetarViewer.java @@ -265,10 +265,23 @@ public class MetarViewer extends ViewerTab implements }); } + /** + * Get the tag for the desired Metar Cache Request. + * + * @param siteID + * @param size + * @return tag + */ private String getTag(String siteID, String size) { return MetarCacheGuidanceRequest.getTag(siteID, size); } + /** + * Request desired data for display on the tab. A check is performed and if + * all data is cached a request is queued to immediately update the tab. + * Otherwise request is made to cache missing data and update the display + * once it arrives. + */ @Override public int generateGuidance(String siteID) { int cnt = super.generateGuidance(siteID); @@ -360,6 +373,11 @@ public class MetarViewer extends ViewerTab implements } } + /** + * Indicates if flight category alerts are highlighted. + * + * @return state true when highlighted otherwise false + */ public boolean highlightAlerts() { boolean state = false; if (!this.isDisposed()) { @@ -487,6 +505,13 @@ public class MetarViewer extends ViewerTab implements return siteObj; } + /** + * This creates a Metar cache data request. + * + * @param siteID + * @param size + * @return req + */ private CacheGuidanceRequest createCacheRequest(String siteID, String size) { MetarCacheGuidanceRequest req = new MetarCacheGuidanceRequest(); req.setTag(getTag(siteID, size)); @@ -496,6 +521,9 @@ public class MetarViewer extends ViewerTab implements return req; } + /** + * Queue a cache request for the list of sites. + */ @Override public void generateCache(List siteIDs) { String size = prevChkHrs; diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MosViewer.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MosViewer.java index dbf05e48f9..7229a26075 100755 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MosViewer.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/MosViewer.java @@ -167,6 +167,9 @@ public class MosViewer extends ViewerTab implements */ private List stationList; + /** + * Current header and data information displayed in the tab. + */ private String[] currentGuidance; /** @@ -600,7 +603,7 @@ public class MosViewer extends ViewerTab implements public String getSite(String site) { return chooseModel(site, model); } - + /** * Obtain the model. * diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/PythonGuidanceJob.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/PythonGuidanceJob.java index d9ea12f8d1..4945f90073 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/PythonGuidanceJob.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/PythonGuidanceJob.java @@ -73,16 +73,36 @@ public class PythonGuidanceJob extends AbstractQueueJob { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(PythonGuidanceJob.class); + /** + * The single instance of this class. + */ private static PythonGuidanceJob instance; + /** + * List of tabs to send alerts to in order to purge data cache. + */ private static final List viewerList = new ArrayList (); + /** + * instance of python to execute the python methods. + */ private PythonScript python; + /** + * Object to synchronize on when changing the suspendJob state. + */ private Object suspendMonitor; + /** + * flag to indicate job is suspended. + */ private boolean suspendJob; + /** + * Private constructor to enforce singleton. + * + * @param name + */ private PythonGuidanceJob(String name) { super(name); suspendMonitor = new Object(); @@ -90,6 +110,9 @@ public class PythonGuidanceJob extends AbstractQueueJob { setupDispose(); } + /** + * Flag to indicate job should go away. + */ private boolean shutdown = false; /** @@ -124,30 +147,49 @@ public class PythonGuidanceJob extends AbstractQueueJob { return instance; } + /** + * Shutdowns the running instance and cleans up any threads. + */ private void shutdown() { shutdown = true; restart(); instance = null; } + /** + * Add a tab that needs to be told about alerts. + * + * @param viewerTab + */ public final static synchronized void addViewerTab(ViewerTab viewerTab) { viewerList.add(viewerTab); PythonCacheGuidanceJob.getInstance().restart(); PythonGuidanceJob.getInstance().restart(); } + /** + * Tab is being disposed and no longer needs to receive alerts. + * + * @param viewerTab + */ public final static synchronized void removeViwerTab(ViewerTab viewerTab) { viewerList.remove(viewerTab); PythonCacheGuidanceJob.suspend(); PythonGuidanceJob.suspend(); } + /** + * Stop process of request and clear the queue. + */ private final static void suspend() { if (instance != null) { instance.suspendJob = true; } } + /** + * Restart processing of request. + */ private void restart() { synchronized (instance.suspendMonitor) { instance.suspendJob = false; @@ -155,6 +197,9 @@ public class PythonGuidanceJob extends AbstractQueueJob { } } + /** + * Set up dispose listener to clean up when Cave goes away. + */ private void setupDispose() { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() @@ -337,6 +382,12 @@ public class PythonGuidanceJob extends AbstractQueueJob { return Status.OK_STATUS; } + /** + * This method does not return until the list of cache requests are + * completed. + * + * @param cacheRequests + */ public void waitForCacheRequests(List cacheRequests) { PythonCacheGuidanceJob.getInstance() .waitForCacheRequests(cacheRequests); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TampRequest.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TampRequest.java index 24f6927815..31513f042e 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TampRequest.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TampRequest.java @@ -56,6 +56,9 @@ public class TampRequest extends GuidanceRequest { protected ArrayList siteObjs; + /** + * Overrides the method to place the arguments needed for TAMP request. + */ @Override public Map getPythonArguments() { Map map = new HashMap (); diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TugViewer.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TugViewer.java index f3ffd7e97b..8b4ac27fc2 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TugViewer.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/TugViewer.java @@ -279,6 +279,12 @@ public class TugViewer extends ViewerTab implements } } + /** + * Request desired data for display on the tab. A check is performed and if + * all data is cached a request is queued to immediately update the tab. + * Otherwise request is made to cache missing data and update the display + * once it arrives. + */ @Override public int generateGuidance(String siteID) { int cnt = super.generateGuidance(siteID); @@ -356,10 +362,22 @@ public class TugViewer extends ViewerTab implements this.stationList = stationList; } + /** + * Get the tag for the desired Tamp Cache Request. + * + * @param siteID + * @return + */ private String getTag(String siteID) { return TampCacheGuidanceRequest.getTag(siteID, model); } + /** + * This creates a Tamp cache data request. + * + * @param siteID + * @return + */ private CacheGuidanceRequest createCacheRequest(String siteID) { TampCacheGuidanceRequest req = new TampCacheGuidanceRequest(); req.setTag(getTag(siteID)); @@ -369,6 +387,9 @@ public class TugViewer extends ViewerTab implements return req; } + /** + * Queue a cache request for the list of sites. + */ @Override public void generateCache(List siteIDs) { for (String siteID : siteIDs) { diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/ViewerTab.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/ViewerTab.java index b6bae85a3d..4b14345a15 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/ViewerTab.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/guidance/ViewerTab.java @@ -123,12 +123,18 @@ public abstract class ViewerTab extends Composite { */ protected IStatusSettable msgStatComp; + /** + * Current site. + */ protected String siteID; + /** + * Taf data for the current site. + */ protected TafSiteData siteData; /** - * When true tab is the active display. + * Indicates when the tab is populated with the user's latest request. */ private boolean displayCurrent = false; @@ -149,8 +155,16 @@ public abstract class ViewerTab extends Composite { */ protected boolean allChkIsSelected; + /** + * Dialog the viewer is associated with. + */ protected TafViewerEditorDlg tafViewerEditorDlg; + /** + * Set dialog viewer is associated with. + * + * @param tafViewerEditorDlg + */ public void setTafViewerEditorDlg(TafViewerEditorDlg tafViewerEditorDlg) { this.tafViewerEditorDlg = tafViewerEditorDlg; } @@ -168,6 +182,13 @@ public abstract class ViewerTab extends Composite { PythonGuidanceJob.addViewerTab(this); } + /** + * Method sub-classes must implement to request the caching of data + * displayed by the tab. + * + * @param siteIDs + * list of sites needing data cached + */ abstract public void generateCache(List siteIDs); /* @@ -185,18 +206,40 @@ public abstract class ViewerTab extends Composite { super.dispose(); } + /** + * + * @return displayCurrent true when tab is populated with the current + * request + */ public boolean isDisplayCurrent() { return displayCurrent; } + /** + * Set the current display's status. When true the tab is populate with the + * current request. When false the tab is waiting to be updated with the + * current request. + * + * @param displayCurrent + */ public void setDisplayCurrent(boolean displayCurrent) { this.displayCurrent = displayCurrent; } + /** + * Indicates the tab is selected as the current tab being displayed. + * + * @return currentTab + */ public boolean isCurrentTab() { return currentTab; } + /** + * Set the current tab state. + * + * @param currentTab + */ public void setCurrentTab(boolean currentTab) { this.currentTab = currentTab; } @@ -249,20 +292,29 @@ public abstract class ViewerTab extends Composite { protected abstract void createTopControls(ResourceConfigMgr configMgr); /** - * This method is called so any extra initialization/setup and be done after - * the initializeComponents method is called. + * This method is called so any extra initialization/setup can be performed + * after the initializeComponents method is called. */ protected abstract void finalInitialization(); + /** + * From the GUI the user can select various options to queue another display + * request prior to a previous request being finished. This variable is used + * to determine the last request queued so it will be the one to populate + * the tab. + */ private AtomicInteger generatGuidanceCount = new AtomicInteger( Integer.MIN_VALUE); /** - * Generate the guidance. Must override to queue a request. + * This method must be overridden by the implementing class to perform the + * queue of the type of requested need to populate the tab. The first thing + * the override method should do is call its super method to properly set up + * the siteID, states and to get the count value to return. * * @param siteID * Site ID. - * @return cnt unique count + * @return cnt unique count that increases each time the method is called. */ public int generateGuidance(String siteID) { int cnt = generatGuidanceCount.incrementAndGet(); @@ -271,10 +323,20 @@ public abstract class ViewerTab extends Composite { return cnt; } + /** + * Used to force request to get the current sites data. + */ void reGenerateGuidance() { generateGuidance(siteID); } + /** + * This method must to be called by the implementing class' requestComoplete + * method after it has populated the textComp header and data section. This + * updates the highlighting of the TAF text in the viewer and adjusts the + * width of the this tab's header and data text component so they will stay + * aligned with each other when the horizontal scroll is moved. + */ public void requestComplete() { tafViewerEditorDlg.populateTafViewer(); @@ -471,8 +533,17 @@ public abstract class ViewerTab extends Composite { } } + /** + * + * @return stationList list of sites tab needs to cache data for. + */ public abstract List getStationList(); + /** + * Set the list of stations tab needs to cache data for. + * + * @param stationList + */ public abstract void setStationList(List stationList); /** @@ -503,7 +574,10 @@ public abstract class ViewerTab extends Composite { /** * Queue the retrieval of requests and if still active update display once - * data is retrieved. + * data is retrieved. This starts up a thread to wait for the cache data to + * arrive so this method does not block and freeze the GUI. Once the data + * arrives the cnt is used to determine if the user still wants to display + * the data. * * @param cnt * - Unique count to indicate this request is still active. @@ -569,6 +643,12 @@ public abstract class ViewerTab extends Composite { } } + /** + * Get the TAF's sites configuration information. + * + * @param site + * @return tafSiteData + */ protected TafSiteData getSiteData(String site) { ITafSiteConfig config; TafSiteData data = null; @@ -585,8 +665,25 @@ public abstract class ViewerTab extends Composite { return data; } + /** + * Let the implementing class determine what should be returned for the + * site. + * + * @param site + * @return + */ public abstract String getSite(String site); + /** + * Convince method used by implementing classes to determine what string to + * return for the site base on the site and model. + * + * @param site + * the site + * @param model + * the model being used for the tab + * @return siteId + */ public String chooseModel(String site, String model) { if ("gfslamp".equals(model)) { return getSiteData(site).gfslamp; diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvailMethodsComp.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvailMethodsComp.java index 3b98d3066b..d092d363b6 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvailMethodsComp.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvailMethodsComp.java @@ -34,7 +34,8 @@ import org.eclipse.swt.widgets.Composite; /** * This class creates all of the buttons that corresponds to the available - * methods. + * methods. Example of use is generating the buttons with the various rules + * methods in the Monitoring Rules configuration dialog. * * * SOFTWARE HISTORY @@ -110,10 +111,8 @@ public class AvailMethodsComp extends Composite { } Collections.sort(keyList); - // for (int x = 0; x < methodArray.size(); ++x) { for (String key : keyList) { methodData = methodArray.get(methodIndex.get(key).intValue()); - // methodData = methodArray.get(x); gd = new GridData(160, SWT.DEFAULT); Button tmpBtn = new Button(this, SWT.PUSH); diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigConstants.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigConstants.java index b154f2b79b..a79d78dd43 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigConstants.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigConstants.java @@ -20,7 +20,8 @@ package com.raytheon.viz.avnconfig; /** - * Constants for use in AVNFPS Monitoring Rules + * Constants for use in AVNFPS Monitoring Rules. Use to generate the display for + * the Monitoring Rules dialog. * ** * @author snaples @@ -220,9 +221,8 @@ public class PlotGriddedTempResource extends buf = FloatBuffer.allocate(hrap_grid.maxi * hrap_grid.maxj); /* Get value in the HRAP grid bins. */ - // for (j = 0; j < hrap_grid.maxj; j++) { - for (j = hrap_grid.maxj - 1; j >= 0; j--) { - for (i = 0; i < hrap_grid.maxi; i++) { + for (j = 0; j < hrap_grid.maxj; j++) { + for (i = 0; i < hrap_grid.maxi; i++) { if (hrap_grid.owner[i][j] == -1) { continue; diff --git a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/GetBasinData.java b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/GetBasinData.java index d6495c54ad..d3b41b1b97 100644 --- a/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/GetBasinData.java +++ b/cave/com.raytheon.viz.mpe/src/com/raytheon/viz/mpe/util/GetBasinData.java @@ -134,7 +134,7 @@ public class GetBasinData { mean_areal_precip_global[ib].basin = ppp; for (l = 0; l < numpts; l++) { ibuf = in.readLine().trim(); - String[] locs = ibuf.split(" "); + String[] locs = ibuf.split("\\s+"); lat = Double.parseDouble(locs[0].trim()); lon = Double.parseDouble(locs[1].trim()); diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java index d30d8693a8..8725fd770f 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java @@ -21,9 +21,12 @@ package com.raytheon.viz.radar; import java.io.File; import java.io.FileNotFoundException; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Map; +import java.util.TimeZone; import org.eclipse.swt.graphics.RGB; @@ -44,7 +47,9 @@ import com.raytheon.uf.common.dataplugin.radar.level3.WindBarbPacket; import com.raytheon.uf.common.dataplugin.radar.util.RadarConstants; import com.raytheon.uf.common.dataplugin.radar.util.RadarDataRetriever; import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequest.OrderMode; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; import com.raytheon.uf.common.datastorage.DataStoreFactory; import com.raytheon.uf.common.datastorage.IDataStore; @@ -63,7 +68,8 @@ import com.raytheon.viz.awipstools.common.StormTrackData; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Feb 16, 2009 mnash Initial creation + * Feb 16, 2009 mnash Initial creation + * 03/07/2012 DR 14660 D. Friedman Added time-based getSTIData* functions. * ** @@ -37,6 +38,10 @@ package com.raytheon.viz.avnconfig; */ public class AvnConfigConstants { + + /** + * Rule methods for the mtr tab. + */ private static final String[] mtrs_methods = { "AirportOpsThresh", "CigCatDelta", "CigMetarThresh", "CigTafThresh", "DDDelta", "FFDelta", "FltCatDelta", "FuelAlternate", "LFFMetar", @@ -45,41 +50,97 @@ public class AvnConfigConstants { "CAC_FltCatDelta", "CAC_AirportOpsThresh", "CAC_VsbyMetarThresh", "CAC_VsbyTafThresh", "CAC_WxTafDelta" }; + /** + * Rule methods for the grids tab. + */ private static final String[] grids_methods = { "DDDelta", "FFDelta", "CigCatDelta", "SkyMismatch", "VsbyCatDelta", "WxTafDelta", "WxGridsDelta" }; + /** + * Rule methods for the ltg tab. + */ private static final String[] ltg_methods = { "TSObsDelta" }; + /** + * Rule methods for the rltg tab. + */ private static final String[] rltg_methods = { "TSInTaf", "TSNotInTaf" }; + /** + * Rule methods for the ccfp tab. + */ private static final String[] ccfp_methods = { "TSNotInTaf", "CBNotInTaf" }; + /** + * Rule methods for the llws tab. + */ private static final String[] llws_methods = { "WSinRadar" }; + /** + * Not sure what this is for and could not find any use in the java, python + * or xml files. + */ + @Deprecated public static final String[] MONITORING_RULE_FIELDS = { ".type", ".unique", ".args", ".msg", ".comment" }; + /** + * Not sure what this is for and could not find any use in the java, python + * or xml files. + */ + @Deprecated public static final String ACTIVE_RULES = ".rules.active"; + /** + * + * This enum class associates the tabs name with the methods used to + * generate it rules and the name of the configuration file that contains + * the monitoring rules. + * + */ public enum DataSource { mtrs("mtrs", mtrs_methods), ltg("ltg", ltg_methods), rltg("rltg", rltg_methods), ccfp("ccfp", ccfp_methods), grids("grids", grids_methods), llws("llws", llws_methods); - + /** + * The methods for the monitoring rules + */ private String[] methods; + /** + * The file name without the suffix. + */ private String filename; + /** + * The constructor + * + * @param fname + * - the file name for the desired monitoring rules. + * @param array + * - Array of methods used with the monitoring rules. + */ private DataSource(String fname, String[] array) { methods = array; filename = fname; } + /** + * Get the array of methods used with the monitoring rules. + * + * @return methods + */ public String[] getMethods() { return methods; } + /** + * The name of the configuration file that contains the monitoring + * rules. This assumes the suffix for the file is always ".cfg". + * + * @return filename + */ public String getFilename() { return filename + ".cfg"; } @@ -92,6 +153,12 @@ public class AvnConfigConstants { vsby, wind, sky, wx, cat; } + /** + * + * The various kinds of triggers. Since trigger should be going away most + * likely this should be depreciated and eventually go away. + * + */ public enum triggerType { TAF, METAR, CCFP; } diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigFileUtil.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigFileUtil.java index b3c8561333..53be185426 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigFileUtil.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfigFileUtil.java @@ -29,10 +29,10 @@ import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.localization.LocalizationManager; -import com.raytheon.uf.viz.core.status.StatusConstants; /** - * Aviation File Util class. + * This class contains static methods for handling the localization setup up for + * AvnFPS. * ** @@ -378,7 +379,7 @@ public class RPFFcstPointData extends HydroDBData implements IHydroDBData { @Override public String getDeleteStatement() { - return "DELETE FROM rpffcstpoint WHERE group_id=" + return "DELETE FROM rpffcstpoint WHERE lid="+getDBString(lid)+" and group_id=" + getDBString(groupID); } diff --git a/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java b/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java index c3873d9ff7..3b9ff8f478 100644 --- a/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java +++ b/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/rsc/PlotGriddedTempResource.java @@ -86,7 +86,8 @@ import com.vividsolutions.jts.geom.GeometryFactory; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jun 30, 2009 2524 snaples Initial creation - * + * Feb 29 2010 9909 lbousaidi changed the for loop for getting + * the HRAP grid bin ** @@ -49,7 +49,9 @@ import com.raytheon.uf.viz.core.status.StatusConstants; */ public class AvnConfigFileUtil { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(AvnConfigFileUtil.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(AvnConfigFileUtil.class); + /** * Obtain the LocalizationFile for configuration file. * @@ -63,10 +65,9 @@ public class AvnConfigFileUtil { if (lFile == null) { String site = LocalizationManager.getInstance().getCurrentSite(); - statusHandler.handle(Priority.CRITICAL, - "Unable to find \"" + configFile - + "\" under the directory for site " + site + ".", - null); + statusHandler.handle(Priority.CRITICAL, "Unable to find \"" + + configFile + "\" under the directory for site " + site + + ".", null); } return lFile; @@ -119,12 +120,10 @@ public class AvnConfigFileUtil { File file = pm.getStaticFile(configFile); if (file == null) { - statusHandler.handle(Priority.PROBLEM, - "Unable to find \"" - + configFile - + "\" under the directory for site " - + LocalizationManager.getInstance() - .getCurrentSite() + ".", null); + statusHandler.handle(Priority.PROBLEM, "Unable to find \"" + + configFile + "\" under the directory for site " + + LocalizationManager.getInstance().getCurrentSite() + ".", + null); } return file; diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfiguration.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfiguration.java index 18581440ee..f1144195ef 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfiguration.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/AvnConfiguration.java @@ -43,7 +43,7 @@ import com.raytheon.viz.avnconfig.AvnConfigConstants.DataSource; import com.raytheon.viz.avnconfig.AvnConfigConstants.RuleType; /** - * Contains the configuration for AVNFPS + * Contains the configuration for AVNFPS monitoring rules. * * A "master copy" of the configuration is kept in memory for performance * reasons for dispatching alerts. This copy is read only...and is reloaded when @@ -55,7 +55,7 @@ import com.raytheon.viz.avnconfig.AvnConfigConstants.RuleType; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 12, 2009 avarani Initial creation - * Oct 29, 2010 7262 rferrel Replaced deprecated class, improved + * Oct 29, 2010 7262 rferrel Replaced depreciated class, improved * parsing and allow msg & comment to have * commas in the text. * Sep 27, 2011 10958 rferrel Added checks for required fields in @@ -171,6 +171,10 @@ public class AvnConfiguration { return value.toString(); } + /** + * Load in information for each rule method in DataSource. Information is + * used to populate the Rule Editor section. + */ private void reload() { HierarchicalPreferenceStore store = Activator.getDefault() .getPreferenceStore(); @@ -234,6 +238,19 @@ public class AvnConfiguration { return configuration; } + /** + * Save the monitoring rules to a localized SITE configuration file. + * + * @param site + * - site ID rules are for. + * @param source + * - the kind of data source + * @param data + * - The array of rules + * @throws ConfigurationException + * @throws IOException + * @throws LocalizationOpFailedException + */ public void setRules(String site, DataSource source, ArrayList* @@ -178,8 +180,18 @@ public class GridVectorResource extends AbstractMapVectorResource implements match.setParameterName(Arrays.asList(modelInfo .getParameterAbbreviation())); match.setCreatingEntityNames(Arrays.asList(modelInfo.getModelName())); + String parameterName = modelInfo.getParameterName(); + StyleType st = null; + if (parameterName.equals("Height")) { + st = StyleType.CONTOUR; + } else if (parameterName.equals("Wind") || parameterName.equals("Total Wind") + || parameterName.equals("Total Wind (Vector)")) { + st = StyleType.ARROW; + } else { + st = StyleType.IMAGERY; + } StyleRule secondaryStyleRule = StyleManager.getInstance() - .getStyleRule(StyleType.IMAGERY, match); + .getStyleRule(st, match); if (secondaryStyleRule != null && secondaryStyleRule.getPreferences() .getDisplayUnitLabel() != null) { @@ -189,7 +201,6 @@ public class GridVectorResource extends AbstractMapVectorResource implements legendParams.model = modelInfo; legendParams.unit = secondaryUnits; legendParams.dataTime = getDisplayedDataTime(); - legendParams.type = "Img"; secondaryName = secondaryGenerator.getName(legendParams, ((GridResourceData) resourceData).secondaryResourceData); } catch (Exception e) { diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java index ff92c9075c..cb3a4d5e68 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/AbstractGridResource.java @@ -29,6 +29,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.measure.Measure; +import javax.measure.quantity.Angle; +import javax.measure.unit.NonSI; import javax.measure.unit.Unit; import javax.measure.unit.UnitFormat; @@ -48,6 +50,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.drawables.ColorMapLoader; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IRenderable; import com.raytheon.uf.viz.core.drawables.PaintProperties; @@ -179,6 +182,9 @@ public abstract class AbstractGridResourcedata) throws ConfigurationException, IOException, LocalizationOpFailedException { @@ -296,6 +313,19 @@ public class AvnConfiguration { lFile.save(); } + /** + * Get an array of monitoring rules from the localize SITE file. + * + * @param site + * - site ID rules are for. + * @param source + * - The desired type of rules + * @param maxSeverity + * - The maximum serverity allowed. + * @return rules + * @throws ConfigurationException + * @throws IOException + */ public ArrayList getRules(String site, DataSource source, final int maxSeverity) throws ConfigurationException, IOException { ArrayList rules = new ArrayList (); diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/DataSourceTabComp.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/DataSourceTabComp.java index e161beb674..e690e5edd3 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/DataSourceTabComp.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/DataSourceTabComp.java @@ -724,6 +724,12 @@ public class DataSourceTabComp extends Composite implements activeRules.clear(); saveRules(siteID); + + // TODO The site's rules are removed and replaced with the + // current XXXXs rules. + // Should any monitoring rules configuration files for the + // site be deleted so it will pick up any changes made to the + // default rules? } } } @@ -745,6 +751,13 @@ public class DataSourceTabComp extends Composite implements activeRules); } + /** + * Get the rules that apply for a site and display them. + * + * @param siteID + * @throws LocalizationException + * @throws ConfigurationException + */ public void reloadRules(String siteID) throws LocalizationException, ConfigurationException { this.siteID = siteID; @@ -752,6 +765,12 @@ public class DataSourceTabComp extends Composite implements populateList(); } + /** + * Load active rules for the tab. + * + * @throws LocalizationException + * @throws ConfigurationException + */ private void loadActiveRulesList() throws LocalizationException, ConfigurationException { AvnConfiguration config = AvnConfiguration.load(false); @@ -765,6 +784,11 @@ public class DataSourceTabComp extends Composite implements } } + /** + * The DataSource type associated with this tab. + * + * @return dataSource + */ public String getDataSource() { return pageData.getDataSource(); } diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/FindReplaceDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/FindReplaceDlg.java index eca5e1adcf..dd5fde579e 100755 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/FindReplaceDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/FindReplaceDlg.java @@ -375,6 +375,7 @@ public class FindReplaceDlg extends CaveSWTDialog { * "Replace by" text field */ private void replaceAll() { + // TODO change to: while(findWhatText() { replaceText();} while (1 == 1) { if (findWhatText()) { replaceText(); diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/LabelTextComp.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/LabelTextComp.java index 3fe267c228..48ca7ef27c 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/LabelTextComp.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/LabelTextComp.java @@ -210,6 +210,14 @@ public class LabelTextComp extends Composite { }); } + /** + * Replace the text for the control text field associated with key and if + * applicable change its background color. + * + * @param key + * @param text + * - new text + */ public void updateTextControl(String key, String text) { Text textControl = textControlMap.get(key); textControl.setText(text); diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MessageStatusComp.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MessageStatusComp.java index 61e0df816c..43e38ad139 100755 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MessageStatusComp.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MessageStatusComp.java @@ -42,11 +42,11 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; -import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.uf.common.localization.IPathManager; import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; import com.raytheon.uf.common.localization.PathManagerFactory; +import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.viz.avncommon.AvnMessageMgr; import com.raytheon.viz.avncommon.AvnMessageMgr.StatusMessageType; @@ -106,12 +106,14 @@ public class MessageStatusComp extends Composite implements IStatusSettable { private MessageViewerDlg msgViewerDlg; /** - * Background RGB color. + * Background RGB color. Only used at construction time to create + * newBgColor. No need to keep it around in a class variable. */ + @Deprecated private RGB bgRGB; /** - * New background color. + * New background color for the msgViewerBtn. */ private Color newBgColor; @@ -120,18 +122,41 @@ public class MessageStatusComp extends Composite implements IStatusSettable { */ private StatusMessageType msgType = null; + /** + * Use to control the blinking of the background color. + */ private Timer timer; + /** + * Task use by timer to do the blinking work. + */ private TimerTask timerTask; + /** + * Counter used to determine how long to blink. + */ private int timerCounter = 0; + /** + * The color to use for the blinking. + */ private Color currentMsgColor; + /** + * When false blinking is active. + */ private boolean timerDone = true; + /** + * Message background RGB color. Only used at construction time to create + * messageBgColor. No need to keep it around in a class variable. + */ + @Deprecated private RGB messageBgRGB; + /** + * The normal back ground color for the text field. + */ private Color messageBgColor; /** @@ -140,7 +165,11 @@ public class MessageStatusComp extends Composite implements IStatusSettable { * @param parent * Parent composite. * @param bgRGB - * Background RGB. + * Background RGB for dialog display button. (not used therefore + * always defaults to white) + * @param messageBgRGB + * Background RGB for the message textfield. When null defaults + * to white */ public MessageStatusComp(Composite parent, RGB bgRGB, RGB messageBgRGB) { super(parent, SWT.NONE); @@ -162,7 +191,10 @@ public class MessageStatusComp extends Composite implements IStatusSettable { * @param msgType * Status message type. * @param bgRGB - * Background RGB. + * Background RGB for display button. When null defaults to + * white. + * @param messageBgRGB + * Background RGB for text field. When null defaults to white. */ public MessageStatusComp(Composite parent, StatusMessageType msgType, RGB bgRGB, RGB messageBgRGB) { @@ -297,7 +329,7 @@ public class MessageStatusComp extends Composite implements IStatusSettable { } /** - * Set the message text in the dialog. + * Set the message text in the dialog and start the blinking timer. * * @param msg * Message to add to the dialog. diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MethodData.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MethodData.java index 51a864b517..32a032fc72 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MethodData.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MethodData.java @@ -100,6 +100,7 @@ public class MethodData implements Comparable { * @param methodArgsArray * Array of MethodArgData. */ + // TODO - no references to this constructor. Can it be removed? public MethodData(String methodName, String comment, ArrayList methodArgsArray) { this.methodName = methodName; @@ -314,10 +315,20 @@ public class MethodData implements Comparable { } } + /** + * Set flag to indicate message comes from a file. + * + * @param value + */ public void setMsgFromFile(boolean value) { msgFromFile = value; } + /** + * Indicates if message comes form a file. + * + * @return + */ public boolean getMsgFromFile() { return msgFromFile; } diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MonitoringCriteriaDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MonitoringCriteriaDlg.java index 2535e26877..84f85402f1 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MonitoringCriteriaDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/MonitoringCriteriaDlg.java @@ -88,7 +88,7 @@ public class MonitoringCriteriaDlg extends Dialog { private Text siteIdTF; /** - * Site ID + * Site ID initially set to the default id. */ private String siteId = "XXXX"; @@ -391,12 +391,22 @@ public class MonitoringCriteriaDlg extends Dialog { StatusMessageType.MonitoringCriteria, null, null); } + /** + * Create the rule methods for all pages. + */ private void createDefaultRuleData() { for (DataSource source : DataSource.values()) { defaultRuleData.addPageData(createPageData(source)); } } + /** + * Get the rule methods for a given page + * + * @param dataSource + * source associated with the page + * @return pageData + */ private PageData createPageData(DataSource dataSource) { PageData pageData = new PageData(dataSource.toString()); AvnConfiguration configData = AvnConfiguration.load(false); @@ -409,6 +419,12 @@ public class MonitoringCriteriaDlg extends Dialog { return pageData; } + /** + * Obtain the data information and comment for a give rule. + * + * @param rule + * @return methodData + */ private MethodData createMethodData(MethodData rule) { MethodData methodData = new MethodData(rule.getMethodName(), rule.getComment(), rule.getMessage(), rule.getType(), @@ -425,10 +441,22 @@ public class MonitoringCriteriaDlg extends Dialog { return methodData; } + /** + * Create a Method Data Argument. + * + * @param argName + * Name of the argument to be displayed + * @param argValue + * Default value for the argument + * @return methodArgData + */ private MethodArgData createMethodArgData(String argName, String argValue) { return new MethodArgData(argName, argValue); } + /** + * Load the monitoring rules currently in use for site selected by the user. + */ private void loadSite() { siteId = siteIdTF.getText().trim().toUpperCase(); siteIdTF.setText(siteId); diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/OpenSaveDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/OpenSaveDlg.java index c2cd138d2f..b19e2eb2dc 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/OpenSaveDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/OpenSaveDlg.java @@ -43,6 +43,21 @@ import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; +/** + * This class generates a list of localized files that can be opened in the + * AvnFPS Text Editor. + * + * + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * + *+ * + * @version 1.0 + */ public class OpenSaveDlg extends Dialog { /** * Dialog shell. @@ -54,28 +69,67 @@ public class OpenSaveDlg extends Dialog { */ private Display display; + /** + * Used to indicate if the dialog is being used for open or save as dialog. + * Only the OPEN is used. + */ + // TODO remove the SAVE_AS code that is not used change the constructor to + // not use. + @Deprecated public static enum DialogType { OPEN, SAVE_AS }; + /** + * Dialog type. This is always OPEN. + */ + @Deprecated private DialogType dialogType; + /** + * Font used to display file list. + */ private Font controlFont; + /** + * List of localized files that can be edited. + */ private List cfgFileList; + /** + * The localize file selected by the user. + */ private LocalizationFile selectedFile; + /** + * List of localized files used to generate the file list. + */ private LocalizationFile[] locFiles; + /** + * Uses file's display name as key to get the associated localized file. + */ private MaplocFileMap; + /** + * Constructor + * + * @param parent + * shell + * @param type + */ public OpenSaveDlg(Shell parent, DialogType type) { super(parent, 0); dialogType = type; } + /** + * Display dialog and sets the selected file when user clicks on the Open + * button. Any other close leaves the the selected file null. + * + * @return null + */ public Object open() { Shell parent = getParent(); display = parent.getDisplay(); @@ -106,6 +160,9 @@ public class OpenSaveDlg extends Dialog { return null; } + /** + * Set up the dialog's display components. + */ private void initializeComponents() { locFileMap = new TreeMap (); controlFont = new Font(shell.getDisplay(), "Monospace", 10, SWT.NORMAL); @@ -118,6 +175,10 @@ public class OpenSaveDlg extends Dialog { getAvailableConfigFiles(); } + /** + * Create the label and the scroll list that will contain the files the user + * can edit. + */ private void createListControl() { GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); Composite listComp = new Composite(shell, SWT.NONE); @@ -137,7 +198,13 @@ public class OpenSaveDlg extends Dialog { cfgFileList.setFont(controlFont); } + /** + * Determine based on DialogType what kind of action button to place at the + * bottom of the dialog. + */ private void createBottomButtons() { + // TODO Only the DialogType.OPEN is ever used. Code needs to be + // modified to no longer use DialogType. GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); Composite mainButtonComp = new Composite(shell, SWT.NONE); mainButtonComp.setLayout(new GridLayout(1, false)); @@ -188,6 +255,10 @@ public class OpenSaveDlg extends Dialog { }); } + /** + * Obtain from localization the configuration file information and populate + * the dialog scroll list. + */ private void getAvailableConfigFiles() { String[] extensions = new String[] { ".xml", ".cfg" }; LocalizationType[] types = new LocalizationType[] { @@ -230,6 +301,12 @@ public class OpenSaveDlg extends Dialog { } } + /** + * Obtain the localized file selected by the user or null if no file + * selected. + * + * @return lfile + */ public LocalizationFile getSelectedFile() { return selectedFile; } diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/PageData.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/PageData.java index 0b48490ba3..22e474a458 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/PageData.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/PageData.java @@ -22,24 +22,24 @@ package com.raytheon.viz.avnconfig; import java.util.ArrayList; /** - * A class containing 'page' data where the page is the tab on a tab folder - * and the data contained in each folder. + * A class containing 'page' data where the page is the tab on a tab folder and + * the data contained in each folder. * * * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 22 MAY 2008 1119 lvenable Initial creation + * 22 MAY 2008 1119 lvenable Initial creation * ** * @author lvenable * @version 1.0 - * + * */ public class PageData { /** - * Data source (or page name). + * Data source (or page/tab name). */ private String dataSource; @@ -57,7 +57,9 @@ public class PageData { /** * Constructor. - * @param dataSource Data source (page name). + * + * @param dataSource + * Data source (page name). */ public PageData(String dataSource) { this.dataSource = dataSource; @@ -66,8 +68,11 @@ public class PageData { /** * Constructor. - * @param dataSource Data source (page name). - * @param methodArray Array of MethodData. + * + * @param dataSource + * Data source (page name). + * @param methodArray + * Array of MethodData. */ public PageData(String dataSource, ArrayListmethodArray) { this.dataSource = dataSource; @@ -83,7 +88,9 @@ public class PageData { /** * Add MethodData to the MethodData array. - * @param methodData MethodData object. + * + * @param methodData + * MethodData object. */ public void addMethodData(MethodData methodData) { methodArray.add(methodData); @@ -91,6 +98,7 @@ public class PageData { /** * Get the data source name. + * * @return The data source name. */ public String getDataSource() { @@ -99,7 +107,9 @@ public class PageData { /** * Set the data source name. - * @param dataSource The data source name. + * + * @param dataSource + * The data source name. */ public void setDataSource(String dataSource) { this.dataSource = dataSource; @@ -107,6 +117,7 @@ public class PageData { /** * Get the array of MethodData. + * * @return The array of MethodData. */ public ArrayList getMethodArray() { @@ -115,6 +126,7 @@ public class PageData { /** * Set the array of MethodData. + * * @return The array of MethodData. */ public void setMethodArray(ArrayList methodArray) { diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafProductConfigDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafProductConfigDlg.java index badc13dfb6..2dfaf780e3 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafProductConfigDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafProductConfigDlg.java @@ -605,6 +605,11 @@ public class TafProductConfigDlg extends Dialog { StatusMessageType.TafProdConfig, null, null); } + /** + * Get the product list from configuration and repopulate the product list. + * This assumes getting the new list will places the default product at the + * top of the list. + */ private void update() { try { ITafSiteConfig config = TafSiteConfigFactory.getInstance(); @@ -625,6 +630,9 @@ public class TafProductConfigDlg extends Dialog { } } + /** + * The verify action call back. Displays problems in the status message. + */ private void verify() { try { ITafSiteConfig config = TafSiteConfigFactory.getInstance(); diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigFactory.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigFactory.java index d707b7e0d4..adc743a641 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigFactory.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteConfigFactory.java @@ -9,9 +9,15 @@ import org.apache.commons.configuration.ConfigurationException; * implements the ITafSiteConfig interface. Intent is to allow changing between * classes without having to impact all the other classes that depend on * configuration class. This assumes implementing ITafSiteConfig contains the - * static methods getIntance
andclearInstance
. if + * static methodsgetInstance
andclearInstance
. if * needed it is up to the implementing class to synchronize these methods. * + *
+ *
+ * This class is a bridge form using a single xml configuration file for + * all sites to using the AWIPS I style configuration files. This makes porting + * from AWIPS I easier for sites. + * ** * SOFTWARE HISTORY 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 e1480922e4..0451d7ea87 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 @@ -103,6 +103,9 @@ public class TafSiteConfigIni implements ITafSiteConfig { */ private static final String TMPL_EXT = "template"; + /** + * The template extension with the "." prefix. + */ private static final String TMPL_DOT_EXT = "." + TMPL_EXT; /** @@ -134,6 +137,9 @@ public class TafSiteConfigIni implements ITafSiteConfig { */ private static final String PROD_EXT = "cfg"; + /** + * the product extension the the "." prefix. + */ private static final String PROD_DOT_EXT = "." + PROD_EXT; /** @@ -259,6 +265,13 @@ public class TafSiteConfigIni implements ITafSiteConfig { return triggerMap; } + /** + * Get configuration mapping for the product. + * + * @param product + * @return config - The configuration mapping for the product or null if + * problem getting the mapping. + */ private HierarchicalINIConfiguration getProductConfig(String product) { HierarchicalINIConfiguration config = configMaps.get(product); if (config == null) { @@ -647,6 +660,16 @@ public class TafSiteConfigIni implements ITafSiteConfig { return config; } + /** + * Get an array of localized files from a directory. + * + * @param dir + * The directory to check + * @param ext + * The extension to look file + * @return lFileArray The array of localized files in the directory with the + * desired extension + */ private LocalizationFile[] getLfiles(String dir, String ext) { IPathManager pm = PathManagerFactory.getPathManager(); LocalizationContext context = pm.getContext( diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteInfoEditorDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteInfoEditorDlg.java index ed6b05671e..b6809446c6 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteInfoEditorDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TafSiteInfoEditorDlg.java @@ -309,7 +309,14 @@ public class TafSiteInfoEditorDlg extends Dialog { createBottomMessageControls(); } + /** + * Converts an array into a comma separated string + * + * @param array + * @return string + */ private String arrayToString(String[] array) { + // TODO convert to use StringBuilder. String s = ""; for (int i = 0; i < array.length; i++) { @@ -1577,6 +1584,10 @@ public class TafSiteInfoEditorDlg extends Dialog { return elevationTF.getText().matches("^-?[0-9]+$"); } + /** + * Obtain the site information for the site user entered in site ID text + * field and when valid populate the fields with the information. + */ private void loadSite() { boolean loadFailed = false; String loadFailedMsg = null; diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TextEditorSetupDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TextEditorSetupDlg.java index c9c31e96ac..962848b611 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TextEditorSetupDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TextEditorSetupDlg.java @@ -64,7 +64,7 @@ import com.raytheon.viz.avnconfig.OpenSaveDlg.DialogType; import com.raytheon.viz.ui.dialogs.CaveSWTDialog; /** - * Text Editor dialog. + * A simple text Editor dialog allowing the user to modify a localized file. * ** @@ -1309,7 +1310,7 @@ public class MakeHazardDialog extends CaveSWTDialog implements hazardMap.put("Fire Weather", Arrays.asList("FW.A", "FW.W")); hazardMap.put("Convective Watches", Arrays.asList("SV.A", "TO.A")); hazardMap.put("Coastal Flood", Arrays.asList("CF.S", "LS.S", - "CF.Y", "CF.W", "CF.A", "SU.Y", "SU.W", "LS.Y", "LS.W", + "CF.Y", "CF.W", "CF.A", "SU.Y", "SU.W", "RP.S", "LS.Y", "LS.W", "LS.A")); hazardMap.put("Non-Precipitation", Arrays.asList("AF.W", "AF.Y", "AS.Y", "DU.Y", "DS.W", "EH.W", "EH.A", "EC.W", "EC.A", diff --git a/cave/com.raytheon.viz.grid/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/cave/com.raytheon.viz.grid/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index cb69fac37d..7734079b6e 100644 --- a/cave/com.raytheon.viz.grid/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/cave/com.raytheon.viz.grid/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -7,4 +7,5 @@ com.raytheon.viz.grid.rsc.FfgVizGroupResourceData com.raytheon.viz.grid.rsc.RcmResourceData com.raytheon.viz.grid.rsc.GridLoadProperties com.raytheon.viz.grid.rsc.DataMappedGridResourceData +com.raytheon.viz.grid.rsc.general.DifferenceGridResourceData com.raytheon.viz.grid.GridProductBrowserDataDefinition \ No newline at end of file diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/GribRequestableData.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/GribRequestableData.java index 9ac7930844..a815a1cc4b 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/GribRequestableData.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/GribRequestableData.java @@ -116,9 +116,7 @@ public class GribRequestableData extends AbstractRequestableData { @Override public IDataRecord[] getDataValue(Object arg) throws VizException { - if (arg == null) { - return getDataValue(Request.ALL); - } else if (arg instanceof Request) { + if (arg instanceof Request) { Request request = (Request) arg; SoftReference* SOFTWARE HISTORY @@ -151,6 +151,14 @@ public class TextEditorSetupDlg extends CaveSWTDialog { this(parent, null); } + /** + * Construction. + * + * @param parent + * Parent shell + * @param lFile + * When not null a localized file to load into the editor. + */ public TextEditorSetupDlg(Shell parent, LocalizationFile lFile) { super(parent, SWT.DIALOG_TRIM, CAVE.PERSPECTIVE_INDEPENDENT); setText("AvnFPS Text Editor"); @@ -642,6 +650,9 @@ public class TextEditorSetupDlg extends CaveSWTDialog { editorTextComp.setMenu(popupMenu); } + /** + * The call back action for the Undo button. + */ private void undoText() { if (undoStack.size() > 0) { HashMap* * @author ebabin @@ -517,6 +519,48 @@ public class WeatherElementBrowserDialog extends CaveJFACEDialog { } } + /* + * check for incoming new databases + */ + private void checkForNewSource() { + ListundoData = undoStack.remove(undoStack @@ -666,6 +677,9 @@ public class TextEditorSetupDlg extends CaveSWTDialog { } } + /** + * Call back action for the Redo button. + */ private void redoText() { if (redoStack.size() > 0) { HashMap redoData = redoStack.remove(redoStack @@ -830,6 +844,11 @@ public class TextEditorSetupDlg extends CaveSWTDialog { openFile(dlg.getSelectedFile()); } + /** + * Get the contents of a localized file and populates the editor. + * + * @param lFile + */ private void openFile(LocalizationFile lFile) { openedFile = lFile; diff --git a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TriggerEditorDlg.java b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TriggerEditorDlg.java index eef2bb25e7..4ed7a24e27 100644 --- a/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TriggerEditorDlg.java +++ b/cave/com.raytheon.viz.avnconfig/src/com/raytheon/viz/avnconfig/TriggerEditorDlg.java @@ -51,7 +51,9 @@ import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.avnconfig.AvnConfigConstants.triggerType; /** - * Trigger editor dialog. + * Trigger editor dialog. There are no longer any references to this class in + * any of the java and python code or in the xml configuration files. Consider + * removing this class from the base line. * * * SOFTWARE HISTORY @@ -67,6 +69,7 @@ import com.raytheon.viz.avnconfig.AvnConfigConstants.triggerType; * @version 1.0 * */ +@Deprecated public class TriggerEditorDlg extends Dialog { /** * Dialog shell. diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WEBrowserTypeRecord.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WEBrowserTypeRecord.java index f3a6682f68..321d0f4bca 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WEBrowserTypeRecord.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WEBrowserTypeRecord.java @@ -21,6 +21,7 @@ package com.raytheon.viz.gfe.dialogs; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -31,6 +32,7 @@ import java.util.TimeZone; import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.viz.core.mode.CAVEMode; +import com.raytheon.viz.gfe.GFEServerException; import com.raytheon.viz.gfe.core.DataManager; import com.raytheon.viz.gfe.core.IParmManager; @@ -45,6 +47,7 @@ import com.raytheon.viz.gfe.core.IParmManager; * 06/10/2008 Eric Babin Initial Creation * 04/30/2009 2282 rjpeter Refactored interfaces. * 08/19/2009 2547 rjpeter Implement Test/Prac database display. + * 02/22/2012 14351 mli update with incoming databases ** * @author ebabin @@ -114,6 +117,14 @@ public class WEBrowserTypeRecord { public java.util.ListgetSources() { return sources; } + + /** + * @return the sources + */ + public java.util.List getUpdatedSources() { + makeSources(); + return sources; + } /** * @return the fields @@ -134,9 +145,18 @@ public class WEBrowserTypeRecord { pracFlag = mode.equals(CAVEMode.PRACTICE); testFlag = mode.equals(CAVEMode.TEST); } - List dbs = DataManager.getCurrentInstance() - .getParmManager().getAvailableDbs(); +// List dbs = DataManager.getCurrentInstance() +// .getParmManager().getAvailableDbs(); + // Always retrieve updated databases + List dbs = null; + try { + dbs = DataManager.getCurrentInstance().getClient().getAvailableDbs(); + } catch (GFEServerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + ArrayList filtDB = new ArrayList (); for (DatabaseID db : dbs) { @@ -417,6 +437,25 @@ public class WEBrowserTypeRecord { return possibleParms; } + /** + * Add ParmIDs for new database + */ + public void addNewParmIDs(String newSource) { + ArrayList parmIds = new ArrayList (); + possibleParms = getPossibleParmIDs(); + parmIds.addAll(Arrays.asList(possibleParms)); + + ParmID ids[] = getFields(newSource); + for ( int i = 0; i < ids.length; i++) { + if (!parmIds.contains(ids[i])) { + parmIds.add(ids[i]); + } + } + + possibleParms = new ParmID[parmIds.size()]; + parmIds.toArray(possibleParms); + } + public ArrayList getFilteredParmIDs(String sources[], String fields[], String planes[]) { ArrayList listToReturn = new ArrayList (); diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WeatherElementBrowserDialog.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WeatherElementBrowserDialog.java index 5fb78b0e31..8de9c1c32d 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WeatherElementBrowserDialog.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/WeatherElementBrowserDialog.java @@ -51,6 +51,7 @@ import org.eclipse.swt.widgets.ToolItem; import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID; import com.raytheon.viz.core.mode.CAVEMode; +import com.raytheon.viz.gfe.GFEServerException; import com.raytheon.viz.gfe.core.DataManager; import com.raytheon.viz.gfe.core.parm.Parm; import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; @@ -68,6 +69,7 @@ import com.raytheon.viz.ui.widgets.ToggleSelectList; * 06/27/2008 ebabin Updated to properly add fields. * 04/30/2009 2282 rjpeter Refactored. * 08/19/2009 2547 rjpeter Fix Test/Prac database display. + * 02/22/2012 14351 mli update with incoming new grids. * sortedSources = selectedType.getUpdatedSources(); + + if (sortedSources != null) { + List newSources = new ArrayList (); + + // Check for new new database + for (String source : sortedSources) { + boolean found = false; + for (int i = 0; i < sourceMenu.getItemCount(); i++) { + if (sourceMenu.getItem(i).getText().equals(source)) { + found = true; + break; + } + } + + if (!found) { + newSources.add(source); + } + } + + // create menuItem for new database + if (newSources != null) { + for (String s : newSources) { + selectedType.addNewParmIDs(s); + final MenuItem item = new MenuItem(sourceMenu, SWT.PUSH); + item.setText(s); + item.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + addToList(item.getText(), sourceList); + processSourceSelection(); + } + }); + } + } + } + } + private void processSourceSelection() { java.util.List currentSourceSelection = java.util.Arrays .asList(sourceList.getSelection()); @@ -814,6 +858,9 @@ public class WeatherElementBrowserDialog extends CaveJFACEDialog { sourceToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { + // Check for new source + checkForNewSource(); + Rectangle rect = sourceToolItem.getBounds(); Point pt = new Point(rect.x, rect.y + rect.height); pt = sourceToolBar.toDisplay(pt); @@ -1205,9 +1252,18 @@ public class WeatherElementBrowserDialog extends CaveJFACEDialog { private List getDatabases() { if (databases == null) { - databases = dataManager.getParmManager().getAvailableDbs(); +// databases = dataManager.getParmManager().getAvailableDbs(); + + // Always Retrieve updated databases + try { + databases = DataManager.getCurrentInstance().getClient().getAvailableDbs(); + } catch (GFEServerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - return databases; + + return databases; } private ParmID[] getSelectedParmIDS() { diff --git a/cave/com.raytheon.viz.ghg/src/com/raytheon/viz/ghg/makehazard/MakeHazardDialog.java b/cave/com.raytheon.viz.ghg/src/com/raytheon/viz/ghg/makehazard/MakeHazardDialog.java index 79fc42e50a..ddf751c4cf 100644 --- a/cave/com.raytheon.viz.ghg/src/com/raytheon/viz/ghg/makehazard/MakeHazardDialog.java +++ b/cave/com.raytheon.viz.ghg/src/com/raytheon/viz/ghg/makehazard/MakeHazardDialog.java @@ -110,6 +110,7 @@ import com.raytheon.viz.ui.statusline.StatusStore; * ------------ ---------- ----------- -------------------------- * Jun 5, 2008 Eric Babin Initial Creation * Sep 27,2010 5813 gzhou get etn from param pattern hazXXXnnn + * Feb 28,2012 14436 mli Add RP.S - Rip Current * * record = cache.get(request); if (record != null) { @@ -176,12 +174,10 @@ public class GribRequestableData extends AbstractRequestableData { } return result; + } else { + return getDataValue(Request.ALL); } - throw new VizException(this.getClass().getSimpleName() - + " cannot process request of type: " - + arg.getClass().getSimpleName()); - } public void setDataValue(Request request, IDataRecord[] records) { diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/ImportRequestableData.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/ImportRequestableData.java index e43cdd5e97..8aeb18df05 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/ImportRequestableData.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/ImportRequestableData.java @@ -69,12 +69,10 @@ public class ImportRequestableData extends AliasRequestableData { } public Object getDataValue(Object arg) throws VizException { - if (!(arg instanceof Request)) { - throw new VizException(this.getClass().getSimpleName() - + " cannot process request of type: " - + arg.getClass().getSimpleName()); + Request req = Request.ALL; + if (arg instanceof Request) { + req = (Request) arg; } - Request req = (Request) arg; Object rval = getDataAndConvert(sourceRecord, Request.ALL); if (sourceRecord2 != null) { @@ -167,13 +165,16 @@ public class ImportRequestableData extends AliasRequestableData { } } - /* (non-Javadoc) - * @see com.raytheon.uf.viz.derivparam.data.AliasRequestableData#getDependencies() + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.derivparam.data.AliasRequestableData#getDependencies + * () */ @Override public List getDependencies() { return Arrays.asList(sourceRecord, sourceRecord2); } - - + } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/TiltRequestableData.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/TiltRequestableData.java index a9c5b51591..4dc0bc688d 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/TiltRequestableData.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/data/TiltRequestableData.java @@ -30,6 +30,7 @@ import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; import com.raytheon.viz.grid.util.CoverageUtils; import com.raytheon.viz.grid.util.SliceUtil; import com.raytheon.viz.grid.util.TiltUtils; +import com.vividsolutions.jts.geom.Coordinate; /** * TODO Add Description @@ -49,6 +50,15 @@ import com.raytheon.viz.grid.util.TiltUtils; public class TiltRequestableData extends AbstractRequestableData { + public static class TiltCenterPoint { + private final Coordinate latLon; + + public TiltCenterPoint(Coordinate latLon) { + this.latLon = latLon; + } + + } + public TiltRequestableData(String modelName, Level tiltAngle) { this.source = modelName; this.unit = SI.METER; @@ -61,16 +71,20 @@ public class TiltRequestableData extends AbstractRequestableData { public FloatDataRecord getDataValue(Object arg) throws VizException { GridCoverage coverage = CoverageUtils.getInstance().getCoverage(source); - FloatDataRecord fdr = TiltUtils.getInstance().getHeightGrid(coverage, - level.getLevelonevalue()); - if (arg == null) { - return fdr; - } else if (arg instanceof Request) { - return SliceUtil.slice(fdr, (Request) arg); + FloatDataRecord fdr = null; + if (arg instanceof TiltCenterPoint) { + Coordinate tiltLoc = ((TiltCenterPoint) arg).latLon; + fdr = TiltUtils.getInstance().getHeightGrid(tiltLoc, coverage, + level.getLevelonevalue()); + } else { + fdr = TiltUtils.getInstance().getHeightGrid(coverage, + level.getLevelonevalue()); + } + if (arg instanceof Request) { + return SliceUtil.slice(fdr, (Request) arg); + } else { + return fdr; } - throw new VizException(this.getClass().getSimpleName() - + " cannot process request of type: " - + arg.getClass().getSimpleName()); } } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/record/RequestableDataRecord.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/record/RequestableDataRecord.java index 218a8f431f..8e54101886 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/record/RequestableDataRecord.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/record/RequestableDataRecord.java @@ -36,7 +36,9 @@ import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; import com.raytheon.viz.grid.data.GribRequestableData; +import com.raytheon.viz.grid.data.TiltRequestableData.TiltCenterPoint; import com.raytheon.viz.grid.util.CoverageUtils; +import com.raytheon.viz.grid.util.TiltRequest; /** * The RequestableDataRecord Class @@ -107,7 +109,13 @@ public class RequestableDataRecord extends GribRecord { } public IDataRecord[] getDataRecord(Request request) throws VizException { - Object obj = requester.getDataValue(request); + Object obj = null; + if (request instanceof TiltRequest) { + obj = requester.getDataValue(new TiltCenterPoint( + ((TiltRequest) request).getTiltLocation())); + } else { + obj = requester.getDataValue(request); + } if (obj instanceof IDataRecord[]) { return (IDataRecord[]) obj; } else if (obj instanceof IDataRecord) { diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/AbstractMapVectorResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/AbstractMapVectorResource.java index 501023c605..77a3f48df7 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/AbstractMapVectorResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/AbstractMapVectorResource.java @@ -546,7 +546,14 @@ public abstract class AbstractMapVectorResource extends StorageException, VizException { IDataRecord rec = null; - IDataRecord[] records = DataCubeContainer.getDataRecord(pdo); + IDataRecord[] records = null; + if (pdo instanceof GribRecord) { + records = GridResourceData.getDataRecordsForTilt((GribRecord) pdo, + descriptor); + } + if (records == null) { + records = DataCubeContainer.getDataRecord(pdo); + } if (records != null && records.length > 0) { rec = records[0].clone(); } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java index e8bc15cf11..cb0be38285 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java @@ -252,8 +252,23 @@ public class GridResource extends @Override protected IDataRecord getDataRecord() throws StorageException { - IDataRecord record = super.getDataRecord(); - Unit> realDataUnit = ((GribRecord) pdo).getModelInfo() + GribRecord gribRecord = (GribRecord) pdo; + IDataRecord record = null; + try { + IDataRecord[] records = GridResourceData.getDataRecordsForTilt( + gribRecord, descriptor); + if (records != null && records.length > 0) { + record = records[0]; + } + } catch (VizException e) { + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + e); + } + + if (record == null) { + record = super.getDataRecord(); + } + Unit> realDataUnit = gribRecord.getModelInfo() .getParameterUnitObject(); Unit> expectedDataUnit = getCapability(ColorMapCapability.class) .getColorMapParameters().getDataUnit(); @@ -271,7 +286,7 @@ public class GridResource extends } } } - GridGeometry2D realGridGeometry = ((GribRecord) pdo).getModelInfo() + GridGeometry2D realGridGeometry = gribRecord.getModelInfo() .getLocation().getGridGeometry(); GridGeometry2D expectedGridGeometry = this.gridGeometry[0]; if (!realGridGeometry.equals(expectedGridGeometry)) { @@ -707,7 +722,7 @@ public class GridResource extends } } GridMemoryBasedTileSet mbts = new GridMemoryBasedTileSet( - record.getDataURI(), "Data", numLevels, 512, gridGeometry2D, + record.getDataURI(), "Data", numLevels, 32, gridGeometry2D, this, conversion, PixelInCell.CELL_CORNER, record, viewType); return mbts; } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResourceData.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResourceData.java index 09b910684e..875a7612a2 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResourceData.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResourceData.java @@ -36,20 +36,32 @@ import com.raytheon.uf.common.dataplugin.grib.GribModel; import com.raytheon.uf.common.dataplugin.grib.GribRecord; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.datastorage.Request; +import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.time.CombinedDataTime; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.datastructure.DataCubeContainer; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; import com.raytheon.uf.viz.core.rsc.AbstractResourceData; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.uf.viz.core.rsc.DisplayType; +import com.raytheon.uf.viz.core.rsc.IResourceGroup; import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.uf.viz.core.rsc.ResourceList; import com.raytheon.uf.viz.core.rsc.capabilities.DisplayTypeCapability; +import com.raytheon.uf.viz.d2d.core.map.IDataScaleResource; import com.raytheon.uf.viz.d2d.core.time.LoadMode; import com.raytheon.uf.viz.d2d.core.time.TimeMatcher; import com.raytheon.viz.core.rsc.ICombinedResourceData; import com.raytheon.viz.grid.inv.GribDataCubeAlertMessageParser; import com.raytheon.viz.grid.inv.GridInventory; +import com.raytheon.viz.grid.rsc.general.D2DGribGridResource; +import com.raytheon.viz.grid.rsc.general.DifferenceGridResourceData; +import com.raytheon.viz.grid.util.TiltRequest; +import com.vividsolutions.jts.geom.Coordinate; /** * Resource data for grids from GribRecords @@ -107,6 +119,31 @@ public class GridResourceData extends AbstractRequestableResourceData implements super.update(updateData); } + @Override + public AbstractVizResource, ?> construct(LoadProperties loadProperties, + IDescriptor descriptor) throws VizException { + DisplayType displayType = loadProperties.getCapabilities() + .getCapability(this, DisplayTypeCapability.class) + .getDisplayType(); + if (secondaryResourceData != null + && (displayType == DisplayType.BARB + || displayType == DisplayType.ARROW + || displayType == DisplayType.DUALARROW || displayType == DisplayType.STREAMLINE)) { + // GribGridResource does not support diff through a secondary + // resource, instead it must use a DifferenceGridResource. + ResourcePair one = new ResourcePair(); + one.setResourceData(this); + one.setLoadProperties(loadProperties); + ResourcePair two = new ResourcePair(); + two.setResourceData(secondaryResourceData); + two.setLoadProperties(loadProperties); + this.secondaryResourceData = null; + return new DifferenceGridResourceData(one, two).construct( + loadProperties, descriptor); + } + return super.construct(loadProperties, descriptor); + } + @Override protected AbstractVizResource, ?> constructResource( LoadProperties loadProperties, PluginDataObject[] objects) @@ -121,33 +158,20 @@ public class GridResourceData extends AbstractRequestableResourceData implements case IMAGE: sampling = sampling == null ? true : sampling; return new GridResource(this, loadProperties); - case STREAMLINE: - sampling = sampling == null ? false : sampling; - return new GridVectorResource( - this, - loadProperties, - com.raytheon.viz.pointdata.PointWindDisplay.DisplayType.STREAMLINE); - case BARB: - sampling = sampling == null ? false : sampling; - return new GridVectorResource( - this, - loadProperties, - com.raytheon.viz.pointdata.PointWindDisplay.DisplayType.BARB); case ICON: sampling = sampling == null ? false : sampling; return new GridIconResource(this, loadProperties); + case BARB: case ARROW: - sampling = sampling == null ? false : sampling; - return new GridVectorResource( - this, - loadProperties, - com.raytheon.viz.pointdata.PointWindDisplay.DisplayType.ARROW); case DUALARROW: + case STREAMLINE: + // TODO eventually contour and image should also use + // D2DGribGridResource so that all data requesta nd transform of + // grib data in D2D is in one location. There are only a few + // products that do not work correctly, contours of vector + // direction, and data mapped images. sampling = sampling == null ? false : sampling; - return new GridVectorResource( - this, - loadProperties, - com.raytheon.viz.pointdata.PointWindDisplay.DisplayType.DUALARROW); + return new D2DGribGridResource(this, loadProperties); case CONTOUR: default: sampling = sampling == null ? false : sampling; @@ -155,12 +179,6 @@ public class GridResourceData extends AbstractRequestableResourceData implements } } - protected AbstractVizResource, ?> constructResource(DataTime[] dataTimes, - LoadProperties loadProperties, PluginDataObject[] objects) - throws VizException { - return constructResource(loadProperties, objects); - } - /** * @return the records */ @@ -310,7 +328,6 @@ public class GridResourceData extends AbstractRequestableResourceData implements } List availDataTimes = new ArrayList (); - int j = 0; for (int i = 0; i < primaryTimes.length; i++) { if (primaryTimes[i] != null && secondaryTimes[i] != null) { availDataTimes.add(new CombinedDataTime( @@ -497,4 +514,38 @@ public class GridResourceData extends AbstractRequestableResourceData implements // TODO Auto-generated method stub return null; } + + public static IDataRecord[] getDataRecordsForTilt(GribRecord record, + IDescriptor descriptor) throws VizException { + if (record.getModelInfo().getLevel().getMasterLevel().getName() + .equals("TILT")) { + Coordinate tiltLoc = findTiltLocation(descriptor.getResourceList()); + if (tiltLoc != null) { + TiltRequest request = new TiltRequest(); + request.setType(Request.Type.ALL); + request.setTiltLocation(tiltLoc); + return DataCubeContainer.getDataRecord(record, request, null); + } + } + return null; + + } + + private static Coordinate findTiltLocation(ResourceList resourceList) { + for (ResourcePair rp : resourceList) { + AbstractResourceData resourceData = rp.getResourceData(); + AbstractVizResource, ?> resource = rp.getResource(); + if (resource instanceof IDataScaleResource) { + return ((IDataScaleResource) resource).getCenterLocation(); + } + if (resourceData instanceof IResourceGroup) { + Coordinate tiltLoc = findTiltLocation(((IResourceGroup) resourceData) + .getResourceList()); + if (tiltLoc != null) { + return tiltLoc; + } + } + } + return null; + } } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridVectorResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridVectorResource.java index d961a46023..6f85ad856d 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridVectorResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridVectorResource.java @@ -103,6 +103,8 @@ import com.vividsolutions.jts.geom.Coordinate; * addition to wind speed when sampling * is on. * 01/31/12 14306 kshresth Cursor readout as you sample the dispay + * 02/10/12 14472 mhuang Fixed VB 'Height' field legend display error + * when click 'Diff' button. * * }); dataTimes = new ArrayList (); requestJob = new GridDataRequestJob(this); + // Capabilities need to be inited in construction for things like the + // image combination tool. + initCapabilities(); } /** @@ -284,7 +290,6 @@ public abstract class AbstractGridResource @Override protected void initInternal(IGraphicsTarget target) throws VizException { - initCapabilities(); initStylePreferences(); initSampling(); } @@ -444,7 +449,7 @@ public abstract class AbstractGridResource if (params.getColorMapName() == null) { params.setColorMapName("Grid/gridded data"); } - params.setColorMap(target.buildColorMap(params + params.setColorMap(ColorMapLoader.loadColorMap(params .getColorMapName())); } this.getCapability(ColorMapCapability.class) @@ -592,12 +597,9 @@ public abstract class AbstractGridResource synchronized (requestJob) { GeneralGridData data = this.data.get(time); if (data == null) { - List pdoList = pdos.get(time); - if (pdoList != null) { - data = requestJob.requestData(time, pdoList); - if (data != null) { - this.data.put(time, data); - } + data = requestJob.requestData(time, pdos.get(time)); + if (data != null) { + this.data.put(time, data); } } return data; @@ -678,13 +680,17 @@ public abstract class AbstractGridResource return descriptor.getTimeForResource(this); } - public Measure inspectValue(ReferencedCoordinate coord) - throws VizException { + protected GeneralGridData getCurrentData() { DataTime time = getTimeForResource(); if (time == null) { return null; } - GeneralGridData data = requestData(time); + return requestData(time); + } + + public Measure inspectValue(ReferencedCoordinate coord) + throws VizException { + GeneralGridData data = getCurrentData(); if (data == null) { return null; } @@ -700,6 +706,7 @@ public abstract class AbstractGridResource throw new VizException(e); } + sampleInterpolion.setData(null); Unit> unit = data.getDataUnit(); if (stylePreferences != null) { @@ -714,6 +721,32 @@ public abstract class AbstractGridResource return Measure.valueOf(value, unit); } + public Measure inspectDirection(ReferencedCoordinate coord) + throws VizException { + GeneralGridData data = getCurrentData(); + if (data == null) { + return null; + } + if (!data.isVector()) { + return null; + } + sampleInterpolion.setData(data.getDirection().array()); + float value = Float.NaN; + try { + Coordinate xy = coord.asPixel(descriptor.getGridGeometry()); + value = sampleInterpolion.getReprojectedGridCell((int) xy.x, + (int) xy.y); + } catch (FactoryException e) { + throw new VizException(e); + } catch (TransformException e) { + throw new VizException(e); + } + + sampleInterpolion.setData(null); + + return Measure.valueOf(value, NonSI.DEGREE_ANGLE); + } + @Override public String inspect(ReferencedCoordinate coord) throws VizException { Measure value = inspectValue(coord); @@ -723,8 +756,14 @@ public abstract class AbstractGridResource if (value.getValue().isNaN()) { return "NO DATA"; } - - return inspect(value); + Measure dir = inspectDirection(coord); + if (dir != null) { + return String.format("%.0f\u00B0 ", + dir.floatValue(NonSI.DEGREE_ANGLE)) + + formatInspect(value); + } else { + return formatInspect(value); + } } /** @@ -734,9 +773,19 @@ public abstract class AbstractGridResource * @param unit * @return */ - protected String inspect(Measure value) { - if (value.getUnit() == null) { + protected String formatInspect(Measure value) { + Unit> dataUnit = value.getUnit(); + + if (dataUnit == null) { return sampleFormat.format(value); + } + Unit> styleUnit = null; + if (stylePreferences != null) { + styleUnit = stylePreferences.getDisplayUnits(); + } + if (dataUnit.equals(styleUnit)) { + return sampleFormat.format(value.getValue()) + + stylePreferences.getDisplayUnitLabel(); } else { return sampleFormat.format(value.getValue()) + UnitFormat.getUCUMInstance().format(value.getUnit()); @@ -748,6 +797,7 @@ public abstract class AbstractGridResource pdos.remove(dataTime); data.remove(dataTime); requestJob.remove(dataTime); + dataTimes.remove(dataTime); IRenderable renderable = renderables.remove(dataTime); if (renderable != null) { disposeRenderable(renderable); @@ -790,7 +840,14 @@ public abstract class AbstractGridResource } renderables.clear(); data.clear(); + } + protected List getCurrentPluginDataObjects() { + return pdos.get(getTimeForResource()); + } + + protected List getPluginDataObjects(DataTime time) { + return pdos.get(time); } public AbstractVizResource, ?> getArrowResource() throws VizException { @@ -830,7 +887,8 @@ public abstract class AbstractGridResource public boolean isArrowVector() { DisplayType displayType = getDisplayType(); return displayType == DisplayType.BARB - || displayType == DisplayType.STREAMLINE; + || displayType == DisplayType.STREAMLINE + || displayType == DisplayType.DUALARROW; } public boolean isWindVector() { @@ -840,7 +898,8 @@ public abstract class AbstractGridResource } public boolean isLoadableAsImage() { - return true; + DisplayType displayType = getDisplayType(); + return displayType != DisplayType.IMAGE; } } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/D2DGribGridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/D2DGribGridResource.java new file mode 100644 index 0000000000..92cb89155f --- /dev/null +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/D2DGribGridResource.java @@ -0,0 +1,313 @@ +/** + * 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.viz.grid.rsc.general; + +import java.nio.FloatBuffer; +import java.util.List; + +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridEnvelope2D; +import org.geotools.coverage.grid.GridGeometry2D; +import org.geotools.geometry.DirectPosition2D; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.grib.GribRecord; +import com.raytheon.uf.common.dataplugin.grib.spatial.projections.GridCoverage; +import com.raytheon.uf.common.datastorage.records.IDataRecord; +import com.raytheon.uf.common.geospatial.MapUtil; +import com.raytheon.uf.common.geospatial.ReferencedCoordinate; +import com.raytheon.uf.common.geospatial.interpolation.AbstractInterpolation; +import com.raytheon.uf.common.geospatial.interpolation.BilinearInterpolation; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.map.IMapDescriptor; +import com.raytheon.uf.viz.core.rsc.AbstractNameGenerator; +import com.raytheon.uf.viz.core.rsc.DisplayType; +import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.viz.grid.rsc.GridNameGenerator; +import com.raytheon.viz.grid.rsc.GridNameGenerator.IGridNameResource; +import com.raytheon.viz.grid.rsc.GridNameGenerator.LegendParameters; +import com.raytheon.viz.grid.rsc.GridResourceData; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * + * A much more complex grib grid resource that attempts to match A1 displays + * + * + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Mar 9, 2011 bsteffen Initial creation + * + *+ * + * @author bsteffen + * @version 1.0 + */ +public class D2DGribGridResource extends GribGridResource+ implements IGridNameResource { + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(D2DGribGridResource.class); + + private AbstractInterpolation reprojectionInterpolation; + + public D2DGribGridResource(GridResourceData resourceData, + LoadProperties loadProperties) { + super(resourceData, loadProperties); + if (resourceData.getNameGenerator() == null) { + resourceData.setNameGenerator(new GridNameGenerator()); + } + + } + + @Override + protected void initInternal(IGraphicsTarget target) throws VizException { + for (GribRecord record : resourceData.getRecords()) { + addDataObject(record); + } + super.initInternal(target); + } + + @Override + public void addDataObject(PluginDataObject pdo) { + if (gribModel == null) { + super.addDataObject(pdo); + calculateReprojection(); + } else { + super.addDataObject(pdo); + } + requestData(pdo.getDataTime()); + } + + @Override + public GridGeometry2D getGridGeometry() { + if (reprojectionInterpolation == null) { + return gribModel.getLocation().getGridGeometry(); + } else { + return GridGeometry2D.wrap(reprojectionInterpolation + .getTargetGeometry()); + } + } + + @Override + public GeneralGridData getData(DataTime time, List pdos) + throws VizException { + GeneralGridData data = null; + if (pdos == null) { + return null; + } + // Attempt to figure out if there is a special tilt data request. + GribRecord gribRecord = (GribRecord) pdos.get(0); + IDataRecord[] recs = GridResourceData.getDataRecordsForTilt(gribRecord, + descriptor); + if (recs != null) { + data = getData(recs, gribRecord.getModelInfo() + .getParameterUnitObject()); + } + // If there was no special tilt data just request data from super. + if (data == null) { + data = super.getData(time, pdos); + } + // Now reproject if we need to. + if (reprojectionInterpolation != null) { + try { + if (data.isVector()) { + reprojectionInterpolation.setData(data.getUComponent() + .array()); + float[] udata = reprojectionInterpolation + .getReprojectedGrid(); + reprojectionInterpolation.setData(data.getVComponent() + .array()); + float[] vdata = reprojectionInterpolation + .getReprojectedGrid(); + // When reprojecting it is necessary to recalculate the + // direction of vectors based off the change in the "up" + // direction + GridGeometry2D sourceGeometry = GridGeometry2D + .wrap(reprojectionInterpolation.getSourceGeometry()); + GridGeometry2D targetGeometry = GridGeometry2D + .wrap(reprojectionInterpolation.getTargetGeometry()); + GridEnvelope2D targetRange = targetGeometry + .getGridRange2D(); + + MathTransform grid2crs = targetGeometry.getGridToCRS(); + MathTransform crs2ll = MapUtil + .getTransformToLatLon(targetGeometry + .getCoordinateReferenceSystem()); + + for (int i = 0; i < targetRange.width; i++) { + for (int j = 0; j < targetRange.height; j++) { + int index = i + j * targetRange.width; + if (udata[index] > -9999) { + DirectPosition2D dp = new DirectPosition2D(i, j); + grid2crs.transform(dp, dp); + crs2ll.transform(dp, dp); + Coordinate ll = new Coordinate(dp.x, dp.y); + double rot = MapUtil.rotation(ll, + targetGeometry); + double rot2 = MapUtil.rotation(ll, + sourceGeometry); + double cos = Math.cos(Math.toRadians(180 + rot + - rot2)); + double sin = Math.sin(Math.toRadians(180 + rot + - rot2)); + double u = udata[index]; + double v = vdata[index]; + udata[index] = (float) (cos * u - sin * v); + vdata[index] = (float) (sin * u + cos * v); + } + } + } + data = GeneralGridData.createVectorDataUV( + FloatBuffer.wrap(udata), FloatBuffer.wrap(vdata), + data.getDataUnit()); + + } else { + reprojectionInterpolation.setData(data.getScalarData() + .array()); + float[] fdata = reprojectionInterpolation + .getReprojectedGrid(); + data = GeneralGridData.createScalarData( + FloatBuffer.wrap(fdata), data.getDataUnit()); + } + } catch (TransformException e) { + throw new VizException(e); + } catch (FactoryException e) { + throw new VizException(e); + } + } + // TODO before contours can be switched, we need to handle vector + // direction style rule and reprojection of this data. + // TODO before imaging can be switched over data mapping needs to be + // incorporated. + return data; + } + + @Override + public LegendParameters getLegendParameters() { + LegendParameters legendParams = new LegendParameters(); + legendParams.model = gribModel; + List pdos = getCurrentPluginDataObjects(); + if (pdos != null && !pdos.isEmpty()) { + gribModel = ((GribRecord) pdos.get(0)).getModelInfo(); + } + if (stylePreferences != null) { + legendParams.unit = stylePreferences.getDisplayUnitLabel(); + } + if (legendParams.unit == null) { + legendParams.unit = legendParams.model.getParameterUnit(); + } + DisplayType displayType = getDisplayType(); + if (displayType == DisplayType.STREAMLINE) { + legendParams.type = " Streamlines"; + } else if (displayType == DisplayType.BARB) { + legendParams.type = "Wind Barbs"; + } else if (displayType == DisplayType.ARROW) { + legendParams.type = "Arrows"; + } else if (displayType == DisplayType.IMAGE) { + legendParams.type = "Img"; + } + + return legendParams; + } + + private void calculateReprojection() { + if (descriptor == null || gribModel == null) { + return; + } + GridCoverage location = gribModel.getLocation(); + if (location != null && location.getSpacingUnit().equals("degree")) { + double dx = location.getDx(); + Integer nx = location.getNx(); + if (dx * nx >= 360) { + try { + GridGeometry2D sourceGeometry = location.getGridGeometry(); + GeneralGridGeometry targetGeometry = sourceGeometry; + if (descriptor != null) { + targetGeometry = MapUtil.reprojectGeometry( + sourceGeometry, descriptor.getGridGeometry() + .getEnvelope(), true); + } + reprojectionInterpolation = new BilinearInterpolation( + sourceGeometry, targetGeometry); + clearRequestedData(); + } catch (Exception e) { + reprojectionInterpolation = null; + statusHandler + .handle(Priority.PROBLEM, + "Error reprojecting grid, grid will not be reprojected", + e); + } + } + } + } + + @Override + public void project(CoordinateReferenceSystem crs) throws VizException { + super.project(crs); + calculateReprojection(); + } + + @Override + public void setDescriptor(IMapDescriptor descriptor) { + super.setDescriptor(descriptor); + calculateReprojection(); + } + + @Override + public String inspect(ReferencedCoordinate coord) throws VizException { + if (resourceData.isSampling()) { + return gribModel.getParameterAbbreviation() + " = " + + super.inspect(coord); + } else { + return null; + } + } + + @Override + public String getName() { + if (resourceData == null) { + return super.getName(); + } + AbstractNameGenerator generator = resourceData.getNameGenerator(); + if (generator == null) { + return super.getName(); + } + return generator.getName(this); + } + + @Override + public boolean isLoadableAsImage() { + DisplayType displayType = getDisplayType(); + return displayType == DisplayType.CONTOUR; + } + +} diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResource.java index 965c254161..b93f672c07 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResource.java @@ -39,8 +39,11 @@ import com.raytheon.uf.common.geospatial.interpolation.BilinearInterpolation; import com.raytheon.uf.common.time.CombinedDataTime; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.rsc.IResourceGroup; import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.uf.viz.core.rsc.ResourceList; import com.raytheon.uf.viz.core.rsc.capabilities.GroupNamingCapability; import com.raytheon.uf.viz.core.style.ParamLevelMatchCriteria; import com.raytheon.viz.core.rsc.ICombinedResourceData.CombineOperation; @@ -64,7 +67,8 @@ import com.raytheon.viz.core.rsc.ICombinedResourceData.CombineUtil; * @version 1.0 */ public class DifferenceGridResource extends - AbstractGridResource { + AbstractGridResource implements + IResourceGroup { // Defines a constant size for the difference grid private static final GridEnvelope GRID_ENVELOPE = new GeneralGridEnvelope( @@ -89,9 +93,9 @@ public class DifferenceGridResource extends @Override protected void initInternal(IGraphicsTarget target) throws VizException { - super.initInternal(target); one.init(target); two.init(target); + super.initInternal(target); } @Override @@ -100,6 +104,13 @@ public class DifferenceGridResource extends super.initCapabilities(); } + @Override + protected void paintInternal(IGraphicsTarget target, + PaintProperties paintProps) throws VizException { + paintProps.setDataTime(null); + super.paintInternal(target, paintProps); + } + @Override public ParamLevelMatchCriteria getMatchCriteria() { return one.getMatchCriteria(); @@ -266,4 +277,9 @@ public class DifferenceGridResource extends CombineOperation.DIFFERENCE) + " " + oneTime.getLegendString(); } + @Override + public ResourceList getResourceList() { + return resourceData.getResourceList(); + } + } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResourceData.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResourceData.java index dc75c1dbe1..9c06465665 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResourceData.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/DifferenceGridResourceData.java @@ -23,6 +23,9 @@ import java.util.Arrays; import javax.measure.unit.NonSI; import javax.measure.unit.SI; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.drawables.IDescriptor; @@ -52,11 +55,14 @@ import com.raytheon.uf.viz.core.rsc.ResourceList; * @author bsteffen * @version 1.0 */ +@XmlAccessorType(XmlAccessType.NONE) public class DifferenceGridResourceData extends AbstractResourceData implements IResourceGroup { + @XmlElement private ResourcePair one; + @XmlElement private ResourcePair two; private ResourceList resourceList; diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GeneralGridData.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GeneralGridData.java index 3c05a5e9f9..c8dee9123a 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GeneralGridData.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GeneralGridData.java @@ -207,8 +207,8 @@ public class GeneralGridData { vComponent.rewind(); direction = FloatBuffer.allocate(uComponent.capacity()); while (vComponent.hasRemaining()) { - direction.put((float) Math.atan2(uComponent.get(), - vComponent.get())); + direction.put((float) Math.toDegrees(Math.atan2( + uComponent.get(), vComponent.get()))); } uComponent.rewind(); vComponent.rewind(); diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GribGridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GribGridResource.java index 2d8ea163b0..ccdd9f4345 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GribGridResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GribGridResource.java @@ -21,42 +21,27 @@ package com.raytheon.viz.grid.rsc.general; import java.nio.FloatBuffer; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import javax.measure.Measure; import javax.measure.unit.Unit; -import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.coverage.grid.GridGeometry2D; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.TransformException; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.grib.GribModel; import com.raytheon.uf.common.dataplugin.grib.GribRecord; -import com.raytheon.uf.common.dataplugin.grib.spatial.projections.GridCoverage; import com.raytheon.uf.common.datastorage.records.FloatDataRecord; import com.raytheon.uf.common.datastorage.records.IDataRecord; -import com.raytheon.uf.common.geospatial.MapUtil; -import com.raytheon.uf.common.geospatial.interpolation.AbstractInterpolation; -import com.raytheon.uf.common.geospatial.interpolation.BilinearInterpolation; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.datastructure.DataCubeContainer; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.rsc.DisplayType; +import com.raytheon.uf.viz.core.rsc.AbstractResourceData; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.style.ParamLevelMatchCriteria; import com.raytheon.uf.viz.core.style.level.Level; import com.raytheon.uf.viz.core.style.level.SingleLevel; import com.raytheon.viz.grid.GridLevelTranslator; -import com.raytheon.viz.grid.rsc.GridNameGenerator.IGridNameResource; -import com.raytheon.viz.grid.rsc.GridNameGenerator.LegendParameters; -import com.raytheon.viz.grid.rsc.GridResourceData; /** * @@ -75,27 +60,21 @@ import com.raytheon.viz.grid.rsc.GridResourceData; * @author bsteffen * @version 1.0 */ -public class GribGridResource extends AbstractGridResource - implements IGridNameResource { - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(AbstractGridResource.class); +public class GribGridResource extends + AbstractGridResource { - private GribModel gribModel; + protected GribModel gribModel; - private AbstractInterpolation reprojectionInterpolation; - - protected GribGridResource(GridResourceData resourceData, - LoadProperties loadProperties) { + public GribGridResource(T resourceData, LoadProperties loadProperties) { super(resourceData, loadProperties); } @Override - protected void addDataObject(PluginDataObject pdo) { + public void addDataObject(PluginDataObject pdo) { if (pdo instanceof GribRecord) { if (gribModel == null) { GribRecord gribRecord = (GribRecord) pdo; gribModel = gribRecord.getModelInfo(); - calculateReprojection(); } super.addDataObject(pdo); } @@ -103,58 +82,26 @@ public class GribGridResource extends AbstractGridResource @Override public GridGeometry2D getGridGeometry() { - if (reprojectionInterpolation == null) { - return gribModel.getLocation().getGridGeometry(); - } else { - return GridGeometry2D.wrap(reprojectionInterpolation - .getTargetGeometry()); - } + return gribModel.getLocation().getGridGeometry(); } @Override public GeneralGridData getData(DataTime time, List pdos) throws VizException { - GribRecord gribRecord = (GribRecord) pdos.get(0); - GeneralGridData data = getData(gribRecord); - if (reprojectionInterpolation != null) { - try { - if (data.isVector()) { - reprojectionInterpolation.setData(data.getUComponent() - .array()); - float[] udata = reprojectionInterpolation - .getReprojectedGrid(); - reprojectionInterpolation.setData(data.getVComponent() - .array()); - float[] vdata = reprojectionInterpolation - .getReprojectedGrid(); - data = GeneralGridData.createVectorDataUV( - FloatBuffer.wrap(udata), FloatBuffer.wrap(vdata), - data.getDataUnit()); - } else { - reprojectionInterpolation.setData(data.getScalarData() - .array()); - float[] fdata = reprojectionInterpolation - .getReprojectedGrid(); - data = GeneralGridData.createScalarData( - FloatBuffer.wrap(fdata), data.getDataUnit()); - } - } catch (TransformException e) { - throw new VizException(e); - } catch (FactoryException e) { - throw new VizException(e); - } + if (pdos == null) { + return null; } - return data; - } - - private GeneralGridData getData(GribRecord gribRecord) throws VizException { + GribRecord gribRecord = (GribRecord) pdos.get(0); Unit> dataUnit = gribRecord.getModelInfo().getParameterUnitObject(); IDataRecord[] dataRecs = DataCubeContainer.getDataRecord(gribRecord); + return getData(dataRecs, dataUnit); + } + + protected GeneralGridData getData(IDataRecord[] dataRecs, Unit> dataUnit) { if (dataRecs.length == 1) { if (dataRecs[0] instanceof FloatDataRecord) { - float[] fdata = ((FloatDataRecord) dataRecs[0]).getFloatData(); return GeneralGridData.createScalarData( - FloatBuffer.wrap(fdata), dataUnit); + wrapDataRecord(dataRecs[0]), dataUnit); } } else if (dataRecs.length == 2) { FloatBuffer mag = wrapDataRecord(dataRecs[0]); @@ -170,9 +117,15 @@ public class GribGridResource extends AbstractGridResource return null; } - private FloatBuffer wrapDataRecord(IDataRecord record) { + protected FloatBuffer wrapDataRecord(IDataRecord record) { if (record instanceof FloatDataRecord) { float[] fdata = ((FloatDataRecord) record).getFloatData(); + fdata = Arrays.copyOf(fdata, fdata.length); + for (int i = 0; i < fdata.length; i++) { + if (fdata[i] <= -9999) { + fdata[i] = Float.NaN; + } + } return FloatBuffer.wrap(fdata); } return null; @@ -180,6 +133,9 @@ public class GribGridResource extends AbstractGridResource @Override public ParamLevelMatchCriteria getMatchCriteria() { + if (gribModel == null) { + return null; + } ParamLevelMatchCriteria criteria = new ParamLevelMatchCriteria(); criteria.setParameterName(new ArrayList ()); criteria.setLevels(new ArrayList ()); @@ -201,67 +157,13 @@ public class GribGridResource extends AbstractGridResource } @Override - public LegendParameters getLegendParameters() { - LegendParameters legendParams = new LegendParameters(); - legendParams.model = gribModel; - if (stylePreferences != null) { - legendParams.unit = stylePreferences.getDisplayUnitLabel(); - } - if (legendParams.unit == null) { - legendParams.unit = gribModel.getParameterUnit(); - } - legendParams.type = DisplayType.getAbbreviation(getDisplayType()); - - return legendParams; - } - - private void calculateReprojection() { - GridCoverage location = gribModel.getLocation(); - if (descriptor != null && location != null - && location.getSpacingUnit().equals("degree")) { - double dx = location.getDx(); - Integer nx = location.getNx(); - if (dx * nx >= 360) { - try { - GridGeometry2D sourceGeometry = location.getGridGeometry(); - GeneralGridGeometry targetGeometry = sourceGeometry; - if (descriptor != null) { - targetGeometry = MapUtil.reprojectGeometry( - sourceGeometry, descriptor.getGridGeometry() - .getEnvelope(), true); - } - reprojectionInterpolation = new BilinearInterpolation( - sourceGeometry, targetGeometry); - clearRequestedData(); - } catch (Exception e) { - reprojectionInterpolation = null; - statusHandler - .handle(Priority.PROBLEM, - "Error reprojecting grid, grid will not be reprojected", - e); - } - } - } - } - - @Override - public void project(CoordinateReferenceSystem crs) throws VizException { - super.project(crs); - calculateReprojection(); - } - - @Override - public void setDescriptor(IMapDescriptor descriptor) { - super.setDescriptor(descriptor); - calculateReprojection(); - } - - @Override - protected String inspect(Measure value) { - if (resourceData.isSampling()) { - return super.inspect(value); + public String getName() { + if (gribModel == null) { + return "Grib Data"; } else { - return null; + return gribModel.getModelTitle() + " " + + gribModel.getLevel().toString() + " " + + gribModel.getParameterName(); } } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java index 77358c0d8e..eedacc4350 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GridDataRequestJob.java @@ -55,7 +55,7 @@ import com.raytheon.uf.viz.core.exception.VizException; class GridDataRequestJob extends Job { private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(Job.class); + .getHandler(GridDataRequestJob.class); private static class GridDataRequest { diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltRequest.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltRequest.java new file mode 100644 index 0000000000..10cfe6a4a0 --- /dev/null +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltRequest.java @@ -0,0 +1,59 @@ +/** + * This software was developed andimport com.raytheon.uf.common.datastorage.Request; +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.viz.grid.util; + +import com.raytheon.uf.common.datastorage.Request; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * + * This class provides a way for resources to pass a point to the GribDataCube + * adapter that will be used as the center of all TILT levels. + * + * TODO I dont like this class because it causes problems if one of these + * Requests gets inadvertantly sent over to PyPies/HDF5. We need a better way to + * communicate with the GribDataCubeAdapter + * + * + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Nov 9, 2011 bsteffen Initial creation + * + *+ * + * @author bsteffen + * @version 1.0 + */ +public class TiltRequest extends Request { + + private Coordinate tiltLocation; + + public Coordinate getTiltLocation() { + return tiltLocation; + } + + public void setTiltLocation(Coordinate tiltLocation) { + this.tiltLocation = tiltLocation; + } + +} diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltUtils.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltUtils.java index c1f782eb5a..b69a2e77dc 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltUtils.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/TiltUtils.java @@ -19,14 +19,10 @@ **/ package com.raytheon.viz.grid.util; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import org.geotools.coverage.grid.GridEnvelope2D; import org.geotools.coverage.grid.GridGeometry2D; @@ -42,9 +38,8 @@ import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.status.StatusConstants; -import com.raytheon.viz.grid.Activator; import com.raytheon.viz.radar.util.StationUtils; +import com.vividsolutions.jts.geom.Coordinate; /** * Utility for generating grids of tilt heights for a Radar. @@ -62,13 +57,59 @@ import com.raytheon.viz.radar.util.StationUtils; * @version 1.0 */ public class TiltUtils { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(TiltUtils.class); + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(TiltUtils.class); - private MapgridRadiusCache = new HashMap (); + private static class CacheKey { - private ConcurrentMap gridRadiusCacheTime = new ConcurrentHashMap (); + private final int coverageId; - private Timer purgeTimer; + private final double lat; + + private final double lon; + + public CacheKey(int coverageId, double lon, double lat) { + this.coverageId = coverageId; + this.lat = lat; + this.lon = lon; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + coverageId; + long temp; + temp = Double.doubleToLongBits(lat); + result = prime * result + (int) (temp ^ (temp >>> 32)); + temp = Double.doubleToLongBits(lon); + result = prime * result + (int) (temp ^ (temp >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CacheKey other = (CacheKey) obj; + if (coverageId != other.coverageId) + return false; + if (Double.doubleToLongBits(lat) != Double + .doubleToLongBits(other.lat)) + return false; + if (Double.doubleToLongBits(lon) != Double + .doubleToLongBits(other.lon)) + return false; + return true; + } + + } + + private Map > gridRadiusCache = new HashMap >(); private static TiltUtils instance; @@ -81,25 +122,7 @@ public class TiltUtils { } private TiltUtils() { - purgeTimer = new Timer(); - TimerTask purgeTask = new TimerTask() { - @Override - public void run() { - // keep last 10 minutes of heights - long purgeTime = System.currentTimeMillis() - 600000; - Iterator > iter = gridRadiusCacheTime - .entrySet().iterator(); - while (iter.hasNext()) { - Entry entry = iter.next(); - if (entry.getValue() < purgeTime) { - gridRadiusCache.remove(entry.getKey()); - iter.remove(); - } - } - } - }; - purgeTimer.schedule(purgeTask, 600, 600000); } /** @@ -109,15 +132,32 @@ public class TiltUtils { * in degrees */ public FloatDataRecord getHeightGrid(GridCoverage coverage, double tilt) { - Integer coverageId = coverage.getId(); RadarStation homeRadar = StationUtils.getInstance() .getHomeRadarStation(); + return getHeightGrid(homeRadar, coverage, tilt); + } - if (homeRadar != null) { + public FloatDataRecord getHeightGrid(Coordinate latLon, + GridCoverage coverage, double tilt) { + + RadarStation radar = StationUtils.getInstance().getClosestRadarStation( + latLon.x, latLon.y); + return getHeightGrid(radar, coverage, tilt); + } + + private FloatDataRecord getHeightGrid(RadarStation radar, + GridCoverage coverage, double tilt) { + CacheKey cacheKey = new CacheKey(coverage.getId(), radar.getLon(), + radar.getLat()); + if (radar != null) { GridGeometry2D geometry = MapUtil.getGridGeometry(coverage); GridEnvelope2D gridRange = geometry.getGridRange2D(); - double[] radius = gridRadiusCache.get(coverageId); + double[] radius = null; + Reference radiusRef = gridRadiusCache.get(cacheKey); + if (radiusRef != null) { + radius = radiusRef.get(); + } if (radius == null) { try { @@ -126,8 +166,8 @@ public class TiltUtils { MathTransform fromLatLon = MapUtil .getTransformFromLatLon(coverage.getCrs()); - double[] radarLonLat = new double[] { - homeRadar.getLon(), homeRadar.getLat() }; + double[] radarLonLat = new double[] { radar.getLon(), + radar.getLat() }; double[] radarCrsCoord = new double[2]; fromLatLon.transform(radarLonLat, 0, radarCrsCoord, 0, 1); @@ -156,27 +196,31 @@ public class TiltUtils { // use geodetic calculator MathTransform gridToLatLon = geometry.getGridToCRS(); - radius = getRadius(gridRange, gridToLatLon); + radius = getRadius(radar, gridRange, gridToLatLon); } - gridRadiusCache.put(coverageId, radius); + gridRadiusCache.put(cacheKey, new SoftReference ( + radius)); } catch (Exception e) { - statusHandler.handle( - Priority.PROBLEM, - "Error occurred generating height grid for radar tilt", - e); + statusHandler + .handle(Priority.PROBLEM, + "Error occurred generating height grid for radar tilt", + e); } } - return getHeightGrid(gridRange, radius, tilt); + return getHeightGrid(radar, gridRange, radius, tilt); } return null; } public FloatDataRecord getHeightGrid(GridEnvelope2D gridRange, MathTransform gridToLatLon, double tilt) { + RadarStation homeRadar = StationUtils.getInstance() + .getHomeRadarStation(); + try { - double[] radius = getRadius(gridRange, gridToLatLon); - return getHeightGrid(gridRange, radius, tilt); + double[] radius = getRadius(homeRadar, gridRange, gridToLatLon); + return getHeightGrid(homeRadar, gridRange, radius, tilt); } catch (TransformException e) { statusHandler.handle(Priority.PROBLEM, "Error occurred generating height grid for radar tilt", e); @@ -184,11 +228,9 @@ public class TiltUtils { return null; } - private FloatDataRecord getHeightGrid(GridEnvelope2D gridRange, - double[] radius, double tilt) { - RadarStation homeRadar = StationUtils.getInstance() - .getHomeRadarStation(); - float elevMeter = homeRadar.getElevMeter(); + private FloatDataRecord getHeightGrid(RadarStation radar, + GridEnvelope2D gridRange, double[] radius, double tilt) { + float elevMeter = radar.getElevMeter(); double tanTilt = Math.tan(Math.toRadians(tilt)); float[] floatData = new float[radius.length]; for (int i = 0; i < radius.length; i++) { @@ -202,10 +244,8 @@ public class TiltUtils { return fdr; } - private double[] getRadius(GridEnvelope2D gridRange, + private double[] getRadius(RadarStation radar, GridEnvelope2D gridRange, MathTransform gridToLatLon) throws TransformException { - RadarStation homeRadar = StationUtils.getInstance() - .getHomeRadarStation(); int numPoints = gridRange.height * gridRange.width; int offset = 0; double[] gridCoordGrid = new double[numPoints * 2]; @@ -220,7 +260,7 @@ public class TiltUtils { double[] radius = new double[numPoints]; GeodeticCalculator gc = new GeodeticCalculator(); - gc.setStartingGeographicPoint(homeRadar.getLon(), homeRadar.getLat()); + gc.setStartingGeographicPoint(radar.getLon(), radar.getLat()); offset = 0; for (int i = 0; i < numPoints; i++) { diff --git a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java index 0e1e1532c5..6463f4d2cf 100644 --- a/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java +++ b/cave/com.raytheon.viz.hydro/src/com/raytheon/viz/hydro/resource/MultiPointResource.java @@ -1490,25 +1490,16 @@ public class MultiPointResource extends Envelope env = new Envelope(coord); List> elements = strTree.query(env); - if (elements.size() > 0) { - Iterator> iter = elements.iterator(); - /* Take the first one in the list */ - if (iter.hasNext()) { - /* element 0 = Coordinate, 1 = inspectString */ - ArrayList> data = (ArrayList>) iter.next(); - - Shell shell = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getShell(); - - GageData gage = getGageData((Coordinate) data.get(0)); - - if ((ts == null) || !ts.isOpen()) { - ts = new TimeSeriesDlg(shell, gage, true); - ts.open(); - } else { - ts.updateSelection(gage, true); - } - } + GageData closestGage=getNearestPoint(coord,elements); + if (closestGage!=null) { + if ((ts == null) || !ts.isOpen()) { + Shell shell = PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getShell(); + ts = new TimeSeriesDlg(shell, closestGage, true); + ts.open(); + } else { + ts.updateSelection(closestGage, true); + } } else { showMessage(); @@ -1549,18 +1540,8 @@ public class MultiPointResource extends Envelope env = new Envelope(coord); List> elements = strTree.query(env); if (elements.size() > 0) { - List> data = elements; - if (elements.size() > 1) { - data = nearest(coord, elements); - } - if ((data != null) && (data.size() > 0)) { - List> element = (List>) data.get(0); - - if ((element != null) && (element.size() > 0)) { - /* element 0 = Coordinate, 1 = inspectString */ - GageData gageData = getGageData((Coordinate) element - .get(0)); - + GageData gageData = getNearestPoint(coord, elements); + if ((gageData != null)) { String lid = gageData.getLid(); String dataType = toPEDTSEP(gageData); String fcstType = null; @@ -1610,7 +1591,6 @@ public class MultiPointResource extends showMessage(); } } - } } /** @@ -1655,35 +1635,37 @@ public class MultiPointResource extends } /** - * Return the data from the input list that is closest to the given + * Return the nearest data in the elements list to the given * coordinate latitude/longitude. * * @param coord * Reference coordinate latitude/longitude - * @param list + * @param elements + * List of Coordinates * @return The closest data if found. If the input list is null or empty a * null reference is returned. */ - private static ArrayList> nearest(Coordinate coord, List> list) { - ArrayList> retList = null; - - double minDist = Double.MAX_VALUE; - if ((list != null) && (list.size() > 0)) { - for (Object o : list) { - if (o instanceof ArrayList>) { - ArrayList> subList = (ArrayList>) o; - Coordinate c = (Coordinate) subList.get(0); - double dx = coord.x - c.x; - double dy = coord.y - c.y; - double dist = (dx * dx) + (dy * dy); - if (dist < minDist) { - minDist = dist; - retList = subList; - } - } - } + private GageData getNearestPoint(Coordinate coord, List> elements) { + if (elements ==null || elements.size() <= 0) { + return null; } - return retList; + + Iterator> iter = elements.iterator(); + double minDistance=Double.MAX_VALUE; + GageData closestGage=null; + while (iter.hasNext()) { + ArrayList> data = (ArrayList>) iter.next(); + + GageData gage = getGageData((Coordinate) data.get(0)); + double lon=gage.getLon(); + double lat=gage.getLat(); + double distance = Math.sqrt(Math.pow((lon-coord.x),2)+Math.pow((lat-coord.y), 2)); + if (distance < minDistance) { + minDistance=distance; + closestGage=gage; + } + } + return closestGage; } /* diff --git a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RPFFcstPointData.java b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RPFFcstPointData.java index df3310617a..c6154fef2b 100644 --- a/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RPFFcstPointData.java +++ b/cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/data/RPFFcstPointData.java @@ -36,6 +36,7 @@ import com.raytheon.viz.hydrocommon.datamanager.HydroDBDataManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 19, 2008 1787 askripsky Initial creation + * Mar 08, 2012 14600 wkwock Delete one lid instead of one group * * result : response.getResults()) { + RadarRecord aRecord = (RadarRecord) result.get(null);; + long difference = Math.abs(aRecord.getDataTime() + .getRefTime().getTime() - targetTime.getTime()); + if (difference < bestDifference) { + bestDifference = difference; + record = aRecord; + } + } + } else { + for (Map result : response.getResults()) { + record = (RadarRecord) result.get(null); + break; + } + } + + if (record != null) { + // Populate the radar record with its data + File loc = HDF5Util.findHDF5Location(record); + IDataStore dataStore = DataStoreFactory.getDataStore(loc); + RadarDataRetriever.populateRadarRecord(dataStore, record); + + // Get the Tabular data from the record + Map > stiMap = record + .getMapRecordVals(); + + String stiDir = null; + String stiSpeed = null; + double direction = 0; + double speed = 0; + + // Get the speed and dir from the record + if (stiMap != null) { + stiDir = stiMap.get(RadarConstants.MapValues.STI_TYPE).get( + RadarConstants.MapValues.STI_AVG_DIRECTION); + stiSpeed = stiMap.get(RadarConstants.MapValues.STI_TYPE) + .get(RadarConstants.MapValues.STI_AVG_SPEED); + } + + if (stiDir == null || stiSpeed == null || + stiDir.isEmpty() || stiSpeed.isEmpty()) { + direction = 0; + speed = 0; + } else { + direction = Double.parseDouble(stiDir); + speed = Double.parseDouble(stiSpeed); + } + + // Populate the return data with the STI data + rval = new StormTrackData(); + rval.setDate(record.getDataTime().getRefTime()); + rval.setMotionDirection(direction); + rval.setMotionSpeed(speed); + } + } catch (FileNotFoundException e) { + exc = e; + } catch (StorageException e) { + exc = e; + } + if (exc != null) + throw new VizException(exc); + return rval; + } + } diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarDefaultInterrogator.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarDefaultInterrogator.java index 568179dd52..cffd819e89 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarDefaultInterrogator.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarDefaultInterrogator.java @@ -124,7 +124,6 @@ public class RadarDefaultInterrogator implements IRadarInterrogator { units = UnitFormat.getUCUMInstance().format(dispUnit); } if (dataValue == 0) { - dataMap.put("numericValue", null); dataValueString = "NO DATA"; } else if (th0 instanceof Float) { double f0 = (Float) th0; diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarSRMResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarSRMResource.java index e8447813cc..9f04dfd31b 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarSRMResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarSRMResource.java @@ -55,7 +55,8 @@ import com.raytheon.viz.radar.ui.RadarDisplayManager; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Jul 2, 2010 mnash Initial creation + * Jul 2, 2010 mnash Initial creation + * 03/07/2012 DR 14660 D. Friedman Use getSTIDataForRadarRecord * * - + - @@ -44,8 +43,8 @@ - - + + -@@ -69,17 +68,8 @@ - +- - - -- - -@@ -212,76 +202,32 @@ - - -- -- - -- - -- - - -- -- - - - - - + - + - + - + - - -- -- - -- - -- - - - -- -- -- + @@ -302,48 +248,25 @@ - - -- -- - -- - -- - - -- -- - - - - @@ -353,28 +276,16 @@ - + - + - + - + - @@ -543,24 +454,11 @@- -- - - -- - -- + @@ -384,7 +295,7 @@ - @@ -395,7 +306,7 @@ - @@ -458,17 +369,17 @@ - + - + - + - - - -- - - -- - -- @@ -574,7 +472,7 @@ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm index 3b4e98c8c2..619a22cd8f 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/VM_global_library.vm @@ -1,830 +1,833 @@ -##### UPDATED 1/26/12 12.1.1-2 BY WARNGEN TEAM - -#* -############################################## -Mile Marker Test Code -macro "mmarkers" use (called out of VM_global_library.vm): - -#mmarkers($name, $type, $markers, $simplify) -where: -$markers is a string, and is the exact "variable" set in the XML "pointSource" tag for this road - - - + -$id is a sequential field from the $markers database table -$name is a string lead in of the road name (e.g. INTERSTATE 95) -$type is a string which describes the type of "marker" (e.g. MILE MARKER) - - may be "MILE MARKER" or something similar, or blank "" - - "" is for use when town names (CHARLESTON) or exit names (THE SUNSET EXIT) -$simplify is a boolean value (true or false) - - true concatenates (FROM MM 2 to 4), - - false is a big list (MM 2...3...AND 4) -############################################## -*# -### AUTHOR: EVAN BOOKBINDER -### PURPOSE: Retrieve closetPoint object name for a given index field -### in the database table. -#macro(getmarker $objMarkers $markeridx) -#set($markercounter = 1) -#foreach($xxmarker in $objMarkers) -#if ($markercounter == $markeridx) -$xxmarker.name## -#end -#set($markercounter = $markercounter + 1) -#end -#end - -### AUTHORS: EVAN BOOKBINDER & MIKE DANGELO -### PURPOSE: OUTPUT MILE MARKER, ROAD, INTERSECTION INFO -#macro(mmarkers $markers $id $name $type $simplify) -#set($size = ${list.size($markers)}) -#if (${type.length()} > 0) -#set($singType = "${type} ") -#set($plurType = "${type}S ") -#else -#set($singType = "") -#set($plurType = "") -#end -#set($startMarker = "") -#set($endMarker = "") -#set($counter = 0) -#set($phraseCount = 0) -#set($intIndex = 0) -#if($size > 0) -$name ## -#if($simplify) -#foreach($index in $id) -#set($counter = $counter + 1) -#set($intIndex = $intIndex.parseInt($index.name)) -#if($counter == 1) -#set($startIdx = $intIndex) -#set($endIdx = $intIndex) -#set($startCounter = $counter) -#set($endCounter = $counter) -## Only one item in the list -#if($counter == $size) -## GET MARKER @ INDEX 1 -#set ($marker1 = "#getmarker(${markers},1)") -NEAR $singType$marker1. -#end -##Continuation of current segment -#elseif(($intIndex - $endIdx) == 1 && ($counter != $size)) -#set($endIdx = $intIndex) -#set($endCounter = $counter) -##We've found a break and we're not on the last item -#elseif($counter != $size) -#set ($marker1 = "#getmarker(${markers},${startCounter})") -#set ($marker2 = "#getmarker(${markers},${endCounter})") -#if($startCounter == $endCounter) -NEAR $singType$marker1...## -#else -BETWEEN $plurType$marker1 AND $marker2...## -#end -#set($phraseCount = $phraseCount + 1) -#set($startIdx = $intIndex) -#set($endIdx = $intIndex) -#set($startCounter = $counter) -#set($endCounter = $counter) -## LAST ITEM -#else -#if($phraseCount > 0) -AND ## -#end -##Continuous range (e.g. 1,2,3,4) -#if (($intIndex - $endIdx) == 1) -#set ($marker1 = "#getmarker(${markers},${startCounter})") -#set ($marker2 = "#getmarker(${markers},${counter})") -BETWEEN $plurType$marker1 AND $marker2. -##Isolated mile marker previous and current (e.g. 1,4) -#elseif ($startIdx == $endIdx) -#set ($marker1 = "#getmarker(${markers},${startCounter})") -#set ($marker2 = "#getmarker(${markers},${counter})") -$singType$marker1 AND NEAR $singType$marker2. -##Continuous range + isolated milemarker at end (e.g. 1,2,3,6) -#else -#set ($marker1 = "#getmarker(${markers},${startCounter})") -#set ($marker2 = "#getmarker(${markers},${endCounter})") -#set ($marker3 = "#getmarker(${markers},${counter})") -BETWEEN $plurType$marker1 AND $marker2...AND NEAR $singType$marker3. -#end -#end -#end -#else -NEAR $type## -#foreach($item in $markers) -#set($counter = $counter + 1) -#if($size > 1 && $counter == $size) -AND ${item.name}. -#elseif($size == 1 && $counter == $size) -${item.name}. -#else -${item.name}...## -#end -#end -#end -#end -#end - -#macro(drainages $riverdrainages) -#set($size = ${list.size($riverdrainages)}) -#if($size > 0) -#set($count = 0) -THIS INCLUDES THE FOLLOWING STREAMS AND DRAINAGES...## -#foreach (${drainage} in ${riverdrainages}) -${drainage.name}## -#set($count = $count + 1) -#if($count == $size - 1) - AND ## -#elseif($count < $size) -...## -#end -#end -. - -#end -#end - -#macro(inserttorwatches $watches $list $secondtimezone $dateUtil $timeFormat) -#set($torWatches = ${watches.getTorWatches()}) -#if(${list.size($torWatches)} > 0) -A TORNADO WATCH REMAINS IN EFFECT UNTIL ${dateUtil.format(${watches.getLatestTorTime()}, ${timeFormat.plain}, 15, ${localtimezone})}## -${dateUtil.period(${watches.getLatestTorTime()},${timeFormat.plain}, 15, ${localtimezone})}## -#if(${secondtimezone}) -/${dateUtil.format(${list.get($torWatches, 0).endTime}, ${timeFormat.plain}, 15, ${secondtimezone})}/## -#end - FOR ## -#set($numWatches = ${list.size($torWatches)}) -#set($count = 0) -#foreach(${watch} in ${torWatches}) -#set($count = $count + 1) -#areaFormat(${watch.partOfParentRegion} true false) ${watch.parentRegion}## -#if($count == $numWatches - 1) - AND ## -#elseif($count < $numWatches) -...## -#end -#end -. - -#end -#end - -#macro(insertsvrwatches $watches $list $secondtimezone $dateUtil $timeFormat) -#set($svrWatches = ${watches.getSvrWatches()}) -#if(${list.size($svrWatches)} > 0) -A SEVERE THUNDERSTORM WATCH REMAINS IN EFFECT UNTIL ${dateUtil.format(${watches.getLatestSvrTime()}, ${timeFormat.plain}, 15, ${localtimezone})}## -${dateUtil.period(${watches.getLatestSvrTime()},${timeFormat.plain}, 15, ${localtimezone})}## -#if(${secondtimezone}) -/${dateUtil.format(${list.get($svrWatches, 0).endTime}, ${timeFormat.plain}, 15, ${secondtimezone})}/## -#end - FOR ## -#set($numWatches = ${list.size($svrWatches)}) -#set($count = 0) -#foreach(${watch} in ${svrWatches}) -#set($count = $count + 1) -#areaFormat(${watch.partOfParentRegion} true false) ${watch.parentRegion}## -#if($count == $numWatches - 1) - AND ## -#elseif($count < $numWatches) -...## -#end -#end -. - -#end -#end - -#macro(printcoords $coordinates $list) -#set($count = 0) -LAT...LON ## -#foreach(${coord} in ${coordinates}) -#if($count % 4 == 0 && $count != 0) - - ## -#end -#llFormat(${coord.y}) #llFormat(${coord.x})## -#set($count = $count + 1) -#if($count % 4 != 0 && $count != ${list.size($coordinates)}) - ## -#end -#end -#end - -#macro(headline $officeLoc $backupSite) -#headlineext(${officeLoc}, ${backupSite}, false) -#end - -#macro(backupText $backupSite) -#if($backupSite) -ISSUED BY NATIONAL WEATHER SERVICE ${backupSite} -#end -#end - -#macro(headlineext $officeLoc $backupSite $extend) -#if($extend) -#set($issueVar = "EXTENDED THE") -#else -#set($issueVar = "ISSUED A") -#end -THE NATIONAL WEATHER SERVICE IN ${officeLoc} HAS ${issueVar} -#end - -#macro(direction $d) -#if($d==45) -SOUTHWEST## -#elseif ($d==90) -WEST## -#elseif ($d==135) -NORTHWEST## -#elseif ($d==180) -NORTH## -#elseif ($d==225) -NORTHEAST## -#elseif ($d==270) -EAST## -#elseif ($d==315) -SOUTHEAST## -#else -SOUTH## -#end -#end - -#macro(areaFormat $directionSet $useCentral $useExtreme) -#if($useExtreme) -#if($list.contains($directionSet, "EXTREME")) -EXTREME ## -#end -#end -#if($list.contains($directionSet, "NORTH")) -NORTH## -#end -#if($list.contains($directionSet, "SOUTH")) -SOUTH## -#end -#if($list.contains($directionSet, "EAST")) -EAST## -#end -#if($list.contains($directionSet, "WEST")) -WEST## -#end -#if($useCentral && $list.contains($directionSet, "CENTRAL")) -#if ($list.contains($directionSet, "NORTH") || $list.contains($directionSet, "SOUTH") || $list.contains($directionSet, "EAST") ||$list.contains($directionSet, "WEST")) - ## -#end -CENTRAL## -#elseif ($list.contains($directionSet, "NORTH") || $list.contains($directionSet, "SOUTH") || $list.contains($directionSet, "EAST") ||$list.contains($directionSet, "WEST")) -ERN## -#end -#end - -#macro(llFormat $v) -#set($v100 = $v * 100) -${mathUtil.abs(${mathUtil.round($v100)})}## -#end - -#macro( tml $time $motdir $motspd $timeFormat $eventlocation ) -TIME...MOT...LOC ## -${dateUtil.format(${start}, ${timeFormat.time})}Z ## -${mathUtil.round(${motdir})}DEG ## -${mathUtil.round(${motspd})}KT ## -#foreach(${eventCoord} in ${eventLocation}) -#llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## -#end -#end - -#macro(handleClosestPoints $list, $points1, $points2, $stormType, $nearText, $threshold, $units, $useSecondRef) -#if(${stormType} == "line") -#set($used = []) -#set($used1 = []) -#lineOfStorms($used1, $used, $points1, $threshold, $units) -ALONG A LINE EXTENDING FROM #outputLineOfStorms($used1, $threshold, $units)## -#if($points2 && $useSecondRef) -#set($used2 = []) -#lineOfStorms($used2, $used, $points2, $threshold, $units) -#if(${used1.size()} == ${used2.size()}) -...OR ALONG A LINE EXTENDING FROM #outputLineOfStorms($used2, $threshold, $units)## -#end -#end -#else -#set($point1 = ${list.get(${points1}, 0)}) -#if($points2) -#set($point2 = ${list.get(${points2}, 0)}) -#end -#if($point1.roundedDistance <= $threshold) -${nearText} ## -#else -${point1.roundedDistance} $units #direction(${point1.oppositeRoundedAzimuth}) OF ## -#end -${point1.name}## -#if($point2 && $useSecondRef && ${point2.name} != ${point1.name}) -...OR ${point2.roundedDistance} $units #direction(${point2.oppositeRoundedAzimuth}) OF ${point2.name}## -#end -#end -#end - -#macro(lineOfStorms $toUse, $usedList, $line, $nearThreshold, $units) -#foreach(${closestPoints} in ${line}) -#set($notfound = true) -#foreach(${closestPoint} in ${closestPoints}) -#if(${notfound} && ${usedList.contains(${closestPoint.name})} == false) -#set($notfound = false) -#if(${usedList.add(${closestPoint.name})}) -#end -#if(${toUse.add(${closestPoint})}) -#end -#end -#end -#end -#end - -#macro(outputLineOfStorms $points, $nearThreshold, $units) -#set ($first = "true") -#foreach(${closestPoint} in ${points}) -#if(${first} == "true") -#set ($first = "false") -#else - TO ## -#end -#if(${closestPoint.roundedDistance} < ${nearThreshold}) -${closestPoint.name}## -#else -${closestPoint.roundedDistance} ${units} #direction(${closestPoint.oppositeRoundedAzimuth}) OF ${closestPoint.name}## -#end -#end -#end - -################################################################## -##### BEGIN NEW STATEMENT/ADVISORY COUNTY HEADLINE CODE ########## -## AUTHORED BY EVAN BOOKBINDER WFO EAX 8-18-11 ########## -## useCentralxxx = boolean to use the word CENTRAL in the County or State phrase -## useExtremexxx = boolean to use the word EXTREME in the county of State phrase -################################################################## -#macro(headlineLocList $areas $useCentralCounty $useExtremeCounty $useCentralState $useExtremeState) -#set($countyCount = 0) -#set($counter = 0) -#set($numCounties = ${list.size($areas)}) -#set($numIndepCity = 0) -#set($useStates = false) -### CHECK FOR DUPLICATE COUNTY NAMES WITHIN A CWA -#parse("dupCounties.vm") -#foreach (${area} in ${areas}) -#if(${list.contains($dupcounties, "${area.fips}")}) -#set($useStates = true) -#end -#end -##END DUPE COUNTY NAME CHECK -#foreach (${area} in ${areas}) -#### -## THIS SECTION OF CODE REMOVES CENTRAL AND/OR EXTREME FROM THE PART OF STATE ARRAY -## IF NECESSARY SO THAT WE CAN LOGICALLY DO OUR COMPARISONS -#set($partOfState = []) -#foreach ($pos in ${area.partOfParentRegion}) -#if(${pos} == "CENTRAL") -#if(${useCentralState}) -#set($temp = $partOfState.add(${pos})) -#end -#elseif(${pos} == "EXTREME") -#if(${useExtremeState}) -#set($temp = $partOfState.add(${pos})) -#end -#else -#set($temp = $partOfState.add(${pos})) -#end -#end -#### -#set($counter = $counter + 1) -#set($fipsIdx = 2) -#if(${areaSource.equalsIgnoreCase("MARINEZONES")}) -#set($fipsIdx = 3) -#end -#set($FIPS = ${area.fips.substring(${fipsIdx})}) -#set($intFIPS = 0) -#if(${intFIPS.parseInt($FIPS)} < 500 || ${area.stateabbr} == "TX") -##INITIALIZE CHECK VARIABLES -#if($countyCount == 0) -#if(${area.partOfArea}) -#set($prevPartOfCounty = ${area.partOfArea}) -#else -#set($prevPartOfCounty = []) -#end -#set($prevCounty = ${area.name}) -#set($prevCountyType = ${area.areaNotation}) -#set($prevCountiesType = ${area.areasNotation}) -#set($prevState = ${area.parentRegion}) -#set($prevPartOfState = ${partOfState}) -#end -### BEGIN FORMULATING HEADLINE...CHECKING FOR CHANGES IN PART OF STATE, -### STATE, COUNTYTYPE, AND INDEPENDENT CITIES...AS WELL AS PLURALITY -### -### IF WE ARE NOT ON THE LAST ITEM, BUT WE HAVE EITHER -### 1.) CHANGED COUNTY NOMENCLATURE (COUNTY TO PARISH) -### 2.) CHANGED STATE (and we have a duplicate countyname requiring the state to be output) -### 3.) CHANGED PART OF STATE (and we have a duplicate countyname requiring the state to be output) -#if(${counter} < ${numCounties} && (${prevCountyType} != ${area.areaNotation} || ((${prevState} != ${area.parentRegion} || ${prevPartOfState} != ${partOfState}) && ${useStates} == true))) -#if(${countyCount} == 1) -#if(${counter} > 2) -...## -#end -#if(${prevPartOfCounty.size()} > 0) -#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## -#end - ${prevCounty} ## -#if(${prevCountyType} != ${area.areaNotation} || ${useStates} == true) -${prevCountyType} ## -#end -#if(${useStates} == true) - IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## -#end -#else - AND ## -#if(${prevPartOfCounty.size()} > 0) -#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## -#end -${prevCounty} ## -#if(${prevCountyType} != ${area.areaNotation} || ${useStates} == true) -#if(${countyCount} > 1) -#if(${prevCountiesType}) -${prevCountiesType} ## -#end -#elseif(${prevCountyType}) -${prevCountyType} ## -#end -#end -#if(${useStates} == true) - IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## -#end -#end -#set($countyCount = 1) -### IF WE ARE ON THE LAST ITEM...OUTPUT THE PREVIOUS AND LAST ITEM -#elseif (${counter} == ${numCounties}) -#if(${countyCount} >= 1) -#if(${counter} > 2) -...## -#end -#if(${prevPartOfCounty.size()} > 0) -#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## -#end -${prevCounty} ## -#if(${prevCountyType} != ${area.areaNotation} || (${prevCountyType} != ${area.areaNotation} || ((${prevState} != ${area.parentRegion} || ${prevPartOfState} != ${partOfState}) && ${useStates} == true))) -#if(${countyCount} > 1) -#if(${prevCountiesType}) -${prevCountiesType} ## -#end -#elseif(${prevCountyType}) -${prevCountyType} ## -#end -#end -#if((${prevCountyType} != ${area.areaNotation} || ((${prevState} != ${area.parentRegion} || ${prevPartOfState} != ${partOfState}) && ${useStates} == true))) - IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## -#end - AND ## -#if(${area.partOfArea}) -#areaFormat(${area.partOfArea} ${useCentralCounty} ${useExtremeCounty}) ## -#end -${area.name}## -#if(${countyCount} >= 1) -#if(${area.areasNotation}) - ## -#if(${useStates} == true) - IN${area.areasNotation} ## -#end -#elseif(${area.areaNotation}) -${area.areaNotation} ## -#end -#areaFormat(${partOfState} ${useCentralState} ${useExtremeState}) ${area.parentRegion} ## -#end -#else -#if(${counter} > 1) -...## -#if(${numIndepCity} == 0) - AND ## -#end -#end -#if(${area.partOfArea}) -#areaFormat(${area.partOfArea} ${useCentralCounty} ${useExtremeCounty}) ## -#end -${area.name} ${area.areaNotation} ## -#if(${useStates} == true) - IN#areaFormat(${partOfState} ${useCentralState} ${useExtremeState}) ${area.parentRegion} ## -#end -#end -#set($countyCount = 0) -###ELSE WE ARE IN THE MIDDLE OF OUR LIST WITH NO CHANGES...JUST OUTPUT THE -###AREA NAME -#else -#if(${counter} > 1) -#if(${counter} > 2) -...## -#end -#if(${prevPartOfCounty.size()} > 0) -#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## -#end -${prevCounty} ## -#end -#set($countyCount= $countyCount + 1) -#end -####DONE OUTPUTTING. SET CURRENT VARIABLES TO PREVIOUS -#if(${area.partOfArea}) -#set($prevPartOfCounty = ${area.partOfArea}) -#else -#set($prevPartOfCounty = []) -#end -#set($prevCounty = ${area.name}) -#set($prevCountyType = ${area.areaNotation}) -#set($prevCountiesType = ${area.areasNotation}) -#set($prevState = ${area.parentRegion}) -#set($prevPartOfState = ${partOfState}) -####THIS IS AN INDEPENDENT CITY...ADD TO COUNTER FOR NOW -#else -#set($numIndepCity = $numIndepCity + 1) -#end -#end -#### NOW DO INDEPENDENT CITIES ######### -#if(${numIndepCity} > 0) -#set($indepCityCount = 0) -#foreach (${area} in ${areas}) -#set($FIPS = ${area.fips.substring(2)}) -#set($intFIPS = 0) -#if(${intFIPS.parseInt($FIPS)} >= 500 && ${area.stateabbr} != "TX") -#set($indepCityCount= $indepCityCount + 1) -#if (${indepCityCount} == 1 && ${countyCount} > 0) -#if(${prevPartOfCounty}) -#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## -#end -${prevCounty} ${prevCountyType} ## -#if(${useStates} == true) - IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## -#end -#end -#if (${indepCityCount} == ${numIndepCity}) -#if (${indepCityCount} == 1) -#if (${numCounties} > ${numIndepCity}) -...AND${area.name} ## -#else -${area.name} ## -#end -#else - AND${area.name} ## -#end -#elseif (${indepCityCount} == ${numIndepCity} - 1) -${area.name} ## -#else -${area.name} ...## -#end -#end -#end -#end -#end - -#macro(firstBullet $areas) -#foreach (${area} in ${areas}) -#if(${area.partOfArea}) -#areaFormat(${area.partOfArea} true true) ## -#end -#set($FIPS = ${area.fips.substring(2)}) -#set($intFIPS = 0) -#if(${intFIPS.parseInt($FIPS)} < 500 || ${area.stateabbr} == "TX") -${area.name} ${area.areaNotation} IN #areaFormat(${area.partOfParentRegion} true false)${area.parentRegion}... -#else -${area.name} IN#areaFormat(${area.partOfParentRegion} true false) ${area.parentRegion}... -#end -#end -## COMMENTED OUT 5 LINES BELOW THIS IS GENERALLY NOT UTILIZED - you can unREMARK if desired -## #if(${list.size($area.points)} > 1) -## THIS INCLUDES THE CITIES OF... #foreach (${city} in ${area.points})${city}... #end -## #elseif(${list.size($area.points)} > 0) -## THIS INCLUDES THE CITY OF ${list.get(${area.points},0)} -## #end -#end - -#macro(secondBullet $dateUtil $expire $timeFormat $localtimezone $secondtimezone) -UNTIL ${dateUtil.format(${expire}, ${timeFormat.clock}, 15, ${localtimezone})}## -#if(${secondtimezone}) -/${dateUtil.format(${expire}, ${timeFormat.clock}, 15, ${secondtimezone})}/## -#end -#end - -#macro(thirdBullet $dateUtil $eventtime $timeFormat $localtimezone $secondtimezone) -AT ${dateUtil.format(${eventtime}, ${timeFormat.clock}, ${localtimezone})}## -#if(${secondtimezone}) - /${dateUtil.format(${eventtime}, ${timeFormat.clock}, ${secondtimezone})}/## -#end -#end - -## AUTHOR: EVAN BOOKBINDER -## This macro will output a pathcast based on the thresholds/parameters -## defined in the product's .xml configuration file -## 1 - SEVERE THUNDERSTORMS WILL BE NEAR... -## WARRIOR...MORRIS...KIMBERLY AND BLOUNT SPRINGS AROUND 800 PM CDT... -## TRAFFORD AND HAYDEN AROUND 805 PM CDT... -## COUNTY LINE...BROOKSVILLE AND BANGOR AROUND 810 PM CDT... -## LOCUST FORK AROUND 815 PM CDT... -## Inputs: pathcastLead (string containing a lead-in to the pathcast) -## otherLead (string containing a lead-in to the list of other (typically 3rd level) towns -## pathCast (array of ClosestPoint objects) -## otherPoints (a single ClosestPoint object containing a list of typically 3rd level towns) -## areas (array of area objects (counties, parishes, etc...) -## dateUtil (date utility object) -## timeFormat (time formatting object) -#macro(pathCast $pathcastLead $otherLead $pathCast $otherPoints $areas $dateUtil $timeFormat $marineFlag) -#set($hasPoints = 0) -#foreach(${pc} in ${pathCast}) -#if(${pc.points}) -#set($hasPoints = 1) -#end -#end -#if(${pathCast} && ${hasPoints} == 1) -${pathcastLead} -#foreach (${pc} in ${pathCast}) -#if(${pc.points}) -#set($numCities = ${list.size($pc.points)}) -#set($count = 0) - ## -#foreach (${city} in ${pc.points}) -${city.name}## -#set($count = $count + 1) -#if($count == $numCities - 1) - AND ## -#elseif($count < $numCities) -...## -#end -#end - AROUND ${dateUtil.format(${pc.time}, ${timeFormat.clock}, ${pc.timeZone})}. -#end -#end -###NOW SEARCH FOR OTHER POINTS (PRESUMABLY 3s) AND LIST THEM HERE -#set($numOtherPoints = ${list.size($otherPoints)}) -#if($numOtherPoints > 0) - -OTHER LOCATIONS IMPACTED BY ${otherLead} INCLUDE ## -#set($count = 0) -#foreach(${location} in ${otherPoints}) -#set($count = $count + 1) -${location.name}## -#if($count == $numOtherPoints - 1) - AND ## -#elseif($count < $numOtherPoints) -...## -#else -. -#end -#end -#end -#else -#if($marineFlag == 1) -${otherLead} WILL REMAIN OVER MAINLY OPEN WATERS. -#else -${otherLead} WILL REMAIN OVER MAINLY RURAL AREAS OF ## -#headlineLocList(${areas} true true true false).## -###NOW SEARCH FOR OTHER POINTS (PRESUMABLY 3s) AND LIST THEM HERE -### NEED TO CODE THIS ONCE SECTION IS ADDED -#set($numOtherPoints = ${list.size($thirdTier)}) -#if($numOtherPoints > 0) -..INCLUDING THE FOLLOWING LOCATIONS ## -#set($count = 0) -#foreach(${location} in ${thirdTier}) -#set($count = $count + 1) -${location.name}## -#if($count == $numOtherPoints - 1) - AND ## -#elseif($count < $numOtherPoints) -...## -#else -.## -#end -#end -#end - -#end -#end -#end - -## AUTHOR: EVAN BOOKBINDER -## OUTPUTS A STRING PADDED WITH WHITESPACE -## USED FOR COLUMN FORMATTING OF CITIES -#macro(padOutput $inString $width $lineFeed) -#set($ellipsesTest = $width - 3) -#if(${inString.length()} >= $ellipsesTest) -##return instead of output -#if(${lineFeed}) -${inString.substring(0,$ellipsesTest)}... -#else -${inString.substring(0,$ellipsesTest)}...## -#end -#else -${inString}...## -#if(${lineFeed} == 1) - -#else -#set($bufferSize = $ellipsesTest - ${inString.length()}) -#foreach ($buffer in [1..${bufferSize}]) - ## -#end -#end -#end -#end - -## AUTHOR: EVAN BOOKBINDER -## Updated by Phil Kurimski to fix an error with one location impacted -## This macro will output a location list based on the thresholds/parameters -## defined in the product's .xml configuration file -## 1 - LOCATIONS IMPACTED INCLUDE -## CROSSVILLE... -## COLLINSVILLE... -## 2 - LOCATIONS IMPACTED INCLUDE -## FAIRVIEW...CULLMAN... -## JOPPA...PHELAN... -## ARAB...WILBURN... -## 3 - LOCATIONS IN THE WARNING INCLUDE BUT ARE NOT LIMITED TO -## QUINTON...SUSAN MOORE...WEST JEFFERSON...WARRIOR...ROSA... -## FAIRVIEW...LOCUST FORK...TRAFFORD...ARGO...ANDERSON AND ALTON -## Inputs: bulletLead (string containing a lead-in to the list of cities e.g. LOCATIONS IMPACTED INCLUDE...) -## stormType (string containing the storm type e.g. SEVERE THUNDERSTORM) -## columns (number of columns to list the cities (0 is a normal ellipsees separated list) -## cityList (a single pointSource object containing a list of towns) -## areas (array of area objects (counties, parishes, etc...) -## dateUtil (date utility object) -## timeFormat (time formatting object) -## marineFlag (1 if marine product) -#macro(locationsList $bulletLead $ruralPhrase $columns $cityList $otherCityList $areas $dateUtil $timeFormat $marineFlag) -#set($numMajorPoints = ${list.size($cityList)}) -#if($numMajorPoints > 0) -${bulletLead} -#set($count = 0) -#set($colWidth = 67 / $columns) -#set($colCount = 0) -#foreach(${city} in ${cityList}) -#set($count = $count + 1) -#if($count < $numMajorPoints) -#set($strOutput = "${city.name}...") -#else -#set($strOutput = "${city.name}.") -#end -##Exception for 2 items in straight list -#if((${count} == ${numMajorPoints} - 1) && $columns == 0) -#set($strOutput = "${city.name} ") -#end -##STRAIGHT LIST -#if($columns == 0) -#if($numMajorPoints == 1) -${strOutput}## -#else -#if($count != $numMajorPoints) -${strOutput}## -#else -AND ${strOutput}## - -#end -#end -##ONE PER LINE -#elseif($columns == 1) -#if($count != $numMajorPoints) -${strOutput} -#else -AND ${strOutput} - -#end -##MULTIPLE COLUMNS -#else -#set($colCount = $colCount + 1) -#if($colCount != $columns) -#padOutput(${city.name} $colWidth 0) -#else -#padOutput(${city.name} $colWidth 1) -#set($colCount = 0) -#end -#end -#end -###ADD BLANK LINE AT END -#if($count > 0) - -#end -#else -#if($marineFlag == 1) -${ruralPhrase} WILL REMAIN OVER MAINLY OPEN WATERS. -#else -## NO MAJOR POINTS FOUND. LIST RURAL AREAS -${ruralPhrase} WILL REMAIN OVER MAINLY RURAL AREAS OF #headlineLocList(${areas} true true true false).## -#set($numMinorPoints = ${list.size($otherCityList)}) -#if(${numMinorPoints} == 1) -..INCLUDING THE COMMUNITY OF ## -#elseif(${numMinorPoints} > 1) -..INCLUDING THE COMMUNITIES OF ## -#else - -#end -#set($count = 0) -#foreach(${city} in ${$otherCityList}) -#set($count = $count + 1) -#if(${count} < ${numMinorPoints} - 1) -${city.name}...## -#elseif(${count} == ${numMinorPoints} - 1) -${city.name} ## -#elseif (${count} == ${numMinorPoints} && ${count} != 1) -AND ${city.name}. -#elseif (${count} == ${numMinorPoints}) -${city.name}. - -#end -#end -#end -#end -#end +##### UPDATED 3/2/12 12.2.1-4 BY EVAN BOOKBINDER + +#* +#################################################################################################### +Mile Marker Test Code +macro "mmarkers" use (called out of VM_global_library.vm): + +#mmarkers($name, $id, $type, $markers, $simplify) +where: +$markers is a string, and is the exact "variable" set in the XML "pointSource" tag for this road + -+$id is a sequential field from the $markers database table +$name is a string lead in of the road name (e.g. INTERSTATE 95) +$type is a string which describes the type of "marker" (e.g. MILE MARKER) + - may be "MILE MARKER" or something similar, or blank "" + - "" is for use when town names (CHARLESTON) or exit names (THE SUNSET EXIT) +$simplify is a boolean value (true or false) + - true concatenates (FROM MM 2 to 4), + - false is a big list (MM 2...3...AND 4) +################################################################################################### +*# +### AUTHOR: EVAN BOOKBINDER +### PURPOSE: Retrieve closetPoint object name for a given index field +### in the database table. +#macro(getmarker $objMarkers $markeridx) +#set($markercounter = 1) +#foreach($xxmarker in $objMarkers) +#if ($markercounter == $markeridx) +$xxmarker.name## +#end +#set($markercounter = $markercounter + 1) +#end +#end + +### AUTHORS: EVAN BOOKBINDER & MIKE DANGELO +### PURPOSE: OUTPUT MILE MARKER, ROAD, INTERSECTION INFO +#macro(mmarkers $markers $id $name $type $simplify) +#set($size = ${list.size($markers)}) +#if (${type.length()} > 0) +#set($singType = "${type} ") +#set($plurType = "${type}S ") +#else +#set($singType = "") +#set($plurType = "") +#end +#set($startMarker = "") +#set($endMarker = "") +#set($counter = 0) +#set($phraseCount = 0) +#set($intIndex = 0) +#if($size > 0) +$name ## +#if($simplify) +#foreach($index in $id) +#set($counter = $counter + 1) +#set($intIndex = $intIndex.parseInt($index.name)) +#if($counter == 1) +#set($startIdx = $intIndex) +#set($endIdx = $intIndex) +#set($startCounter = $counter) +#set($endCounter = $counter) +## Only one item in the list +#if($counter == $size) +## GET MARKER @ INDEX 1 +#set ($marker1 = "#getmarker(${markers},1)") +NEAR $singType$marker1. +#end +##Continuation of current segment +#elseif(($intIndex - $endIdx) == 1 && ($counter != $size)) +#set($endIdx = $intIndex) +#set($endCounter = $counter) +##We've found a break and we're not on the last item +#elseif($counter != $size) +#set ($marker1 = "#getmarker(${markers},${startCounter})") +#set ($marker2 = "#getmarker(${markers},${endCounter})") +#if($startCounter == $endCounter) +NEAR $singType$marker1...## +#else +BETWEEN $plurType$marker1 AND $marker2...## +#end +#set($phraseCount = $phraseCount + 1) +#set($startIdx = $intIndex) +#set($endIdx = $intIndex) +#set($startCounter = $counter) +#set($endCounter = $counter) +## LAST ITEM +#else +#if($phraseCount > 0) +AND ## +#end +##Continuous range (e.g. 1,2,3,4) +#if (($intIndex - $endIdx) == 1) +#set ($marker1 = "#getmarker(${markers},${startCounter})") +#set ($marker2 = "#getmarker(${markers},${counter})") +BETWEEN $plurType$marker1 AND $marker2. +##Isolated mile marker previous and current (e.g. 1,4) +#elseif ($startIdx == $endIdx) +#set ($marker1 = "#getmarker(${markers},${startCounter})") +#set ($marker2 = "#getmarker(${markers},${counter})") +$singType$marker1 AND NEAR $singType$marker2. +##Continuous range + isolated milemarker at end (e.g. 1,2,3,6) +#else +#set ($marker1 = "#getmarker(${markers},${startCounter})") +#set ($marker2 = "#getmarker(${markers},${endCounter})") +#set ($marker3 = "#getmarker(${markers},${counter})") +BETWEEN $plurType$marker1 AND $marker2...AND NEAR $singType$marker3. +#end +#end +#end +#else +NEAR $type## +#foreach($item in $markers) +#set($counter = $counter + 1) +#if($size > 1 && $counter == $size) +AND ${item.name}. +#elseif($size == 1 && $counter == $size) +${item.name}. +#else +${item.name}...## +#end +#end +#end +#end +#end + +#macro(drainages $riverdrainages) +#set($size = ${list.size($riverdrainages)}) +#if($size > 0) +#set($count = 0) +THIS INCLUDES THE FOLLOWING STREAMS AND DRAINAGES...## +#foreach (${drainage} in ${riverdrainages}) +${drainage.name}## +#set($count = $count + 1) +#if($count == $size - 1) + AND ## +#elseif($count < $size) +...## +#end +#end +. + +#end +#end + +#macro(inserttorwatches $watches $list $secondtimezone $dateUtil $timeFormat) +#set($torWatches = ${watches.getTorWatches()}) +#if(${list.size($torWatches)} > 0) +A TORNADO WATCH REMAINS IN EFFECT UNTIL ${dateUtil.format(${watches.getLatestTorTime()}, ${timeFormat.plain}, 15, ${localtimezone})}## +${dateUtil.period(${watches.getLatestTorTime()},${timeFormat.plain}, 15, ${localtimezone})}## +#if(${secondtimezone}) +/${dateUtil.format(${list.get($torWatches, 0).endTime}, ${timeFormat.plain}, 15, ${secondtimezone})}/## +#end + FOR ## +#set($numWatches = ${list.size($torWatches)}) +#set($count = 0) +#foreach(${watch} in ${torWatches}) +#set($count = $count + 1) +#areaFormat(${watch.partOfParentRegion} true false) ${watch.parentRegion}## +#if($count == $numWatches - 1) + AND ## +#elseif($count < $numWatches) +...## +#end +#end +. + +#end +#end + +#macro(insertsvrwatches $watches $list $secondtimezone $dateUtil $timeFormat) +#set($svrWatches = ${watches.getSvrWatches()}) +#if(${list.size($svrWatches)} > 0) +A SEVERE THUNDERSTORM WATCH REMAINS IN EFFECT UNTIL ${dateUtil.format(${watches.getLatestSvrTime()}, ${timeFormat.plain}, 15, ${localtimezone})}## +${dateUtil.period(${watches.getLatestSvrTime()},${timeFormat.plain}, 15, ${localtimezone})}## +#if(${secondtimezone}) +/${dateUtil.format(${list.get($svrWatches, 0).endTime}, ${timeFormat.plain}, 15, ${secondtimezone})}/## +#end + FOR ## +#set($numWatches = ${list.size($svrWatches)}) +#set($count = 0) +#foreach(${watch} in ${svrWatches}) +#set($count = $count + 1) +#areaFormat(${watch.partOfParentRegion} true false) ${watch.parentRegion}## +#if($count == $numWatches - 1) + AND ## +#elseif($count < $numWatches) +...## +#end +#end +. + +#end +#end + +#macro(printcoords $coordinates $list) +#set($count = 0) +LAT...LON ## +#foreach(${coord} in ${coordinates}) +#if($count % 4 == 0 && $count != 0) + + ## +#end +#llFormat(${coord.y}) #llFormat(${coord.x})## +#set($count = $count + 1) +#if($count % 4 != 0 && $count != ${list.size($coordinates)}) + ## +#end +#end +#end + +#macro(headline $officeLoc $backupSite) +#headlineext(${officeLoc}, ${backupSite}, false) +#end + +#macro(backupText $backupSite) +#if($backupSite) +ISSUED BY NATIONAL WEATHER SERVICE ${backupSite} +#end +#end + +#macro(headlineext $officeLoc $backupSite $extend) +#if($extend) +#set($issueVar = "EXTENDED THE") +#else +#set($issueVar = "ISSUED A") +#end +THE NATIONAL WEATHER SERVICE IN ${officeLoc} HAS ${issueVar} +#end + +#macro(direction $d) +#if($d==45) +SOUTHWEST## +#elseif ($d==90) +WEST## +#elseif ($d==135) +NORTHWEST## +#elseif ($d==180) +NORTH## +#elseif ($d==225) +NORTHEAST## +#elseif ($d==270) +EAST## +#elseif ($d==315) +SOUTHEAST## +#else +SOUTH## +#end +#end + +#macro(areaFormat $directionSet $useCentral $useExtreme) +#if($useExtreme) +#if($list.contains($directionSet, "EXTREME")) +EXTREME ## +#end +#end +#if($list.contains($directionSet, "NORTH")) +NORTH## +#end +#if($list.contains($directionSet, "SOUTH")) +SOUTH## +#end +#if($list.contains($directionSet, "EAST")) +EAST## +#end +#if($list.contains($directionSet, "WEST")) +WEST## +#end +#if($useCentral && $list.contains($directionSet, "CENTRAL")) +#if ($list.contains($directionSet, "NORTH") || $list.contains($directionSet, "SOUTH") || $list.contains($directionSet, "EAST") ||$list.contains($directionSet, "WEST")) + ## +#end +CENTRAL## +#elseif ($list.contains($directionSet, "NORTH") || $list.contains($directionSet, "SOUTH") || $list.contains($directionSet, "EAST") ||$list.contains($directionSet, "WEST")) +ERN## +#end +#end + +#macro(llFormat $v) +#set($v100 = $v * 100) +${mathUtil.abs(${mathUtil.round($v100)})}## +#end + +#macro( tml $time $motdir $motspd $timeFormat $eventlocation ) +TIME...MOT...LOC ## +${dateUtil.format(${start}, ${timeFormat.time})}Z ## +${mathUtil.round(${motdir})}DEG ## +${mathUtil.round(${motspd})}KT ## +#foreach(${eventCoord} in ${eventLocation}) +#llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## +#end +#end + +#macro(handleClosestPoints $list, $points1, $points2, $stormType, $nearText, $threshold, $units, $useSecondRef) +#if(${stormType} == "line") +#set($used = []) +#set($used1 = []) +#lineOfStorms($used1, $used, $points1, $threshold, $units) +ALONG A LINE EXTENDING FROM #outputLineOfStorms($used1, $threshold, $units)## +#if($points2 && $useSecondRef) +#set($used2 = []) +#lineOfStorms($used2, $used, $points2, $threshold, $units) +#if(${used1.size()} == ${used2.size()}) +...OR ALONG A LINE EXTENDING FROM #outputLineOfStorms($used2, $threshold, $units)## +#end +#end +#else +#set($point1 = ${list.get(${points1}, 0)}) +#if($points2) +#set($point2 = ${list.get(${points2}, 0)}) +#end +#if($point1.roundedDistance <= $threshold) +${nearText} ## +#else +${point1.roundedDistance} $units #direction(${point1.oppositeRoundedAzimuth}) OF ## +#end +${point1.name}## +#if($point2 && $useSecondRef && ${point2.name} != ${point1.name}) +...OR ${point2.roundedDistance} $units #direction(${point2.oppositeRoundedAzimuth}) OF ${point2.name}## +#end +#end +#end + +#macro(lineOfStorms $toUse, $usedList, $line, $nearThreshold, $units) +#foreach(${closestPoints} in ${line}) +#set($notfound = true) +#foreach(${closestPoint} in ${closestPoints}) +#if(${notfound} && ${usedList.contains(${closestPoint.name})} == false) +#set($notfound = false) +#if(${usedList.add(${closestPoint.name})}) +#end +#if(${toUse.add(${closestPoint})}) +#end +#end +#end +#end +#end + +#macro(outputLineOfStorms $points, $nearThreshold, $units) +#set ($first = "true") +#foreach(${closestPoint} in ${points}) +#if(${first} == "true") +#set ($first = "false") +#else + TO ## +#end +#if(${closestPoint.roundedDistance} < ${nearThreshold}) +${closestPoint.name}## +#else +${closestPoint.roundedDistance} ${units} #direction(${closestPoint.oppositeRoundedAzimuth}) OF ${closestPoint.name}## +#end +#end +#end + +################################################################## +##### BEGIN NEW STATEMENT/ADVISORY COUNTY HEADLINE CODE ########## +## AUTHORED BY EVAN BOOKBINDER WFO EAX 8-18-11 ########## +## useCentralxxx = boolean to use the word CENTRAL in the County or State phrase +## useExtremexxx = boolean to use the word EXTREME in the county of State phrase +################################################################## +#macro(headlineLocList $areas $useCentralCounty $useExtremeCounty $useCentralState $useExtremeState) +#set($countyCount = 0) +#set($countyCounter = 0) +#set($itemCount = 0) +#set($numCounties = ${list.size($areas)}) +#set($numIndepCity = 0) +#set($useStates = false) +### CHECK FOR DUPLICATE COUNTY NAMES WITHIN A CWA +#parse("dupCounties.vm") +#foreach (${area} in ${areas}) +#if(${list.contains($dupcounties, "${area.fips}")}) +#set($useStates = true) +#end +#end +##END DUPE COUNTY NAME CHECK +#foreach (${area} in ${areas}) +#### +## THIS SECTION OF CODE REMOVES CENTRAL AND/OR EXTREME FROM THE PART OF STATE ARRAY +## IF NECESSARY SO THAT WE CAN LOGICALLY DO OUR COMPARISONS +#set($partOfState = []) +#foreach ($pos in ${area.partOfParentRegion}) +#if(${pos} == "CENTRAL") +#if(${useCentralState}) +#set($temp = $partOfState.add(${pos})) +#end +#elseif(${pos} == "EXTREME") +#if(${useExtremeState}) +#set($temp = $partOfState.add(${pos})) +#end +#else +#set($temp = $partOfState.add(${pos})) +#end +#end +#### +#set($itemCount = $itemCount + 1) +#set($fipsIdx = 2) +#if(${areaSource.equalsIgnoreCase("MARINEZONES")}) +#set($fipsIdx = 3) +#end +#set($FIPS = ${area.fips.substring(${fipsIdx})}) +#set($intFIPS = 0) +#if(${intFIPS.parseInt($FIPS)} < 500 || ${area.stateabbr} == "TX") +#set($countyCounter = $countyCounter + 1) +##INITIALIZE CHECK VARIABLES +#if($countyCount == 0) +#if(${area.partOfArea}) +#set($prevPartOfCounty = ${area.partOfArea}) +#else +#set($prevPartOfCounty = []) +#end +#set($prevCounty = ${area.name}) +#set($prevCountyType = ${area.areaNotation}) +#set($prevCountiesType = ${area.areasNotation}) +#set($prevState = ${area.parentRegion}) +#set($prevPartOfState = ${partOfState}) +#end +### BEGIN FORMULATING HEADLINE...CHECKING FOR CHANGES IN PART OF STATE, +### STATE, COUNTYTYPE, AND INDEPENDENT CITIES...AS WELL AS PLURALITY +### +### IF WE ARE NOT ON THE LAST ITEM, BUT WE HAVE EITHER +### 1.) CHANGED COUNTY NOMENCLATURE (COUNTY TO PARISH) +### 2.) CHANGED STATE (and we have a duplicate countyname requiring the state to be output) +### 3.) CHANGED PART OF STATE (and we have a duplicate countyname requiring the state to be output) +#if(${itemCount} < ${numCounties} && (${prevCountyType} != ${area.areaNotation} || ((${prevState} != ${area.parentRegion} || ${prevPartOfState} != ${partOfState}) && ${useStates} == true))) +#if(${countyCount} == 1) +#if(${countyCounter} > 2) +...## +#end +#if(${prevPartOfCounty.size()} > 0) +#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## +#end + ${prevCounty} ## +#if(${prevCountyType} != ${area.areaNotation} || ${useStates} == true) +${prevCountyType} ## +#end +#if(${useStates} == true) + IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## +#end +#else + AND ## +#if(${prevPartOfCounty.size()} > 0) +#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## +#end +${prevCounty} ## +#if(${prevCountyType} != ${area.areaNotation} || ${useStates} == true) +#if(${countyCount} > 1) +#if(${prevCountiesType}) +${prevCountiesType} ## +#end +#elseif(${prevCountyType}) +${prevCountyType} ## +#end +#end +#if(${useStates} == true) + IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## +#end +#end +#set($countyCount = 1) +### IF WE ARE ON THE LAST ITEM...OUTPUT THE PREVIOUS AND LAST ITEM +#elseif (${itemCount} == ${numCounties}) +#if(${countyCount} >= 1) +#if(${countyCounter} > 2) +...## +#end +#if(${prevPartOfCounty.size()} > 0) +#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## +#end +${prevCounty} ## +#if(${prevCountyType} != ${area.areaNotation} || (${prevCountyType} != ${area.areaNotation} || ((${prevState} != ${area.parentRegion} || ${prevPartOfState} != ${partOfState}) && ${useStates} == true))) +#if(${countyCount} > 1) +#if(${prevCountiesType}) +${prevCountiesType} ## +#end +#elseif(${prevCountyType}) +${prevCountyType} ## +#end +#end +#if((${prevCountyType} != ${area.areaNotation} || ((${prevState} != ${area.parentRegion} || ${prevPartOfState} != ${partOfState}) && ${useStates} == true))) + IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## +#end + AND ## +#if(${area.partOfArea}) +#areaFormat(${area.partOfArea} ${useCentralCounty} ${useExtremeCounty}) ## +#end +${area.name}## +#if(${countyCount} >= 1) +#if(${area.areasNotation}) + ## +#if(${useStates} == true) + IN${area.areasNotation} ## +#end +#elseif(${area.areaNotation}) +${area.areaNotation} ## +#end +#areaFormat(${partOfState} ${useCentralState} ${useExtremeState}) ${area.parentRegion} ## +#end +#else +#if(${countyCounter} > 1) +...## +#if(${numIndepCity} == 0) + AND ## +#end +#end +#if(${area.partOfArea}) +#areaFormat(${area.partOfArea} ${useCentralCounty} ${useExtremeCounty}) ## +#end +${area.name} ${area.areaNotation} ## +#if(${useStates} == true) + IN#areaFormat(${partOfState} ${useCentralState} ${useExtremeState}) ${area.parentRegion} ## +#end +#end +#set($countyCount = 0) +###ELSE WE ARE IN THE MIDDLE OF OUR LIST WITH NO CHANGES...JUST OUTPUT THE +###AREA NAME +#else +#if(${countyCounter} > 1) +#if(${countyCounter} > 2) +...## +#end +#if(${prevPartOfCounty.size()} > 0) +#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## +#end +${prevCounty} ## +#end +#set($countyCount= $countyCount + 1) +#end +####DONE OUTPUTTING. SET CURRENT VARIABLES TO PREVIOUS +#if(${area.partOfArea}) +#set($prevPartOfCounty = ${area.partOfArea}) +#else +#set($prevPartOfCounty = []) +#end +#set($prevCounty = ${area.name}) +#set($prevCountyType = ${area.areaNotation}) +#set($prevCountiesType = ${area.areasNotation}) +#set($prevState = ${area.parentRegion}) +#set($prevPartOfState = ${partOfState}) +####THIS IS AN INDEPENDENT CITY...ADD TO COUNTER FOR NOW +#else +#set($numIndepCity = $numIndepCity + 1) +#end +#end +#### NOW DO INDEPENDENT CITIES ######### +#if(${numIndepCity} > 0) +#set($indepCityCount = 0) +#foreach (${area} in ${areas}) +#set($FIPS = ${area.fips.substring(2)}) +#set($intFIPS = 0) +#if(${intFIPS.parseInt($FIPS)} >= 500 && ${area.stateabbr} != "TX") +#set($indepCityCount= $indepCityCount + 1) +#if (${indepCityCount} == 1 && ${countyCount} > 0) +#if(${prevPartOfCounty}) +#areaFormat(${prevPartOfCounty} ${useCentralCounty} ${useExtremeCounty}) ## +#end +${prevCounty} ${prevCountyType} ## +#if(${useStates} == true) + IN#areaFormat(${prevPartOfState} ${useCentralState} ${useExtremeState}) ${prevState} ## +#end +#end +#if (${indepCityCount} == ${numIndepCity}) +#if (${indepCityCount} == 1) +### COUNTIES + 1 INDEPENDENT CITY +#if (${numCounties} > ${numIndepCity}) + AND THE${area.name} ## +### NO COUNTIES AND ONE INDEPENDENT CITY +#else +THE${area.name} ## +#end +#else +## MULTIPLE INDEPENDENT CITIES...LAST ITEM IN THE LIST + AND THE${area.name} ## +#end +#else +...THE${area.name} ## +#end +#end +#end +#end +#end + +#macro(firstBullet $areas) +#foreach (${area} in ${areas}) +#if(${area.partOfArea}) +#areaFormat(${area.partOfArea} true true) ## +#end +#set($FIPS = ${area.fips.substring(2)}) +#set($intFIPS = 0) +#if(${intFIPS.parseInt($FIPS)} < 500 || ${area.stateabbr} == "TX") +${area.name} ${area.areaNotation} IN #areaFormat(${area.partOfParentRegion} true false)${area.parentRegion}... +#else +${area.name} IN#areaFormat(${area.partOfParentRegion} true false) ${area.parentRegion}... +#end +#end +## COMMENTED OUT 5 LINES BELOW THIS IS GENERALLY NOT UTILIZED - you can unREMARK if desired +## #if(${list.size($area.points)} > 1) +## THIS INCLUDES THE CITIES OF... #foreach (${city} in ${area.points})${city}... #end +## #elseif(${list.size($area.points)} > 0) +## THIS INCLUDES THE CITY OF ${list.get(${area.points},0)} +## #end +#end + +#macro(secondBullet $dateUtil $expire $timeFormat $localtimezone $secondtimezone) +UNTIL ${dateUtil.format(${expire}, ${timeFormat.clock}, 15, ${localtimezone})}## +#if(${secondtimezone}) +/${dateUtil.format(${expire}, ${timeFormat.clock}, 15, ${secondtimezone})}/## +#end +#end + +#macro(thirdBullet $dateUtil $eventtime $timeFormat $localtimezone $secondtimezone) +AT ${dateUtil.format(${eventtime}, ${timeFormat.clock}, ${localtimezone})}## +#if(${secondtimezone}) + /${dateUtil.format(${eventtime}, ${timeFormat.clock}, ${secondtimezone})}/## +#end +#end + +## AUTHOR: EVAN BOOKBINDER +## This macro will output a pathcast based on the thresholds/parameters +## defined in the product's .xml configuration file +## 1 - SEVERE THUNDERSTORMS WILL BE NEAR... +## WARRIOR...MORRIS...KIMBERLY AND BLOUNT SPRINGS AROUND 800 PM CDT... +## TRAFFORD AND HAYDEN AROUND 805 PM CDT... +## COUNTY LINE...BROOKSVILLE AND BANGOR AROUND 810 PM CDT... +## LOCUST FORK AROUND 815 PM CDT... +## Inputs: pathcastLead (string containing a lead-in to the pathcast) +## otherLead (string containing a lead-in to the list of other (typically 3rd level) towns +## pathCast (array of ClosestPoint objects) +## otherPoints (a single ClosestPoint object containing a list of typically 3rd level towns) +## areas (array of area objects (counties, parishes, etc...) +## dateUtil (date utility object) +## timeFormat (time formatting object) +#macro(pathCast $pathcastLead $otherLead $pathCast $otherPoints $areas $dateUtil $timeFormat $marineFlag) +#set($hasPoints = 0) +#foreach(${pc} in ${pathCast}) +#if(${pc.points}) +#set($hasPoints = 1) +#end +#end +#if(${pathCast} && ${hasPoints} == 1) +${pathcastLead} +#foreach (${pc} in ${pathCast}) +#if(${pc.points}) +#set($numCities = ${list.size($pc.points)}) +#set($count = 0) + ## +#foreach (${city} in ${pc.points}) +${city.name}## +#set($count = $count + 1) +#if($count == $numCities - 1) + AND ## +#elseif($count < $numCities) +...## +#end +#end + AROUND ${dateUtil.format(${pc.time}, ${timeFormat.clock}, ${pc.timeZone})}. +#end +#end +###NOW SEARCH FOR OTHER POINTS (PRESUMABLY 3s) AND LIST THEM HERE +#set($numOtherPoints = ${list.size($otherPoints)}) +#if($numOtherPoints > 0) + +OTHER LOCATIONS IMPACTED BY ${otherLead} INCLUDE ## +#set($count = 0) +#foreach(${location} in ${otherPoints}) +#set($count = $count + 1) +${location.name}## +#if($count == $numOtherPoints - 1) + AND ## +#elseif($count < $numOtherPoints) +...## +#else +. +#end +#end +#end +#else +#if($marineFlag == 1) +${otherLead} WILL REMAIN OVER MAINLY OPEN WATERS. +#else +${otherLead} WILL REMAIN OVER MAINLY RURAL AREAS OF ## +#headlineLocList(${areas} true true true false).## +###NOW SEARCH FOR OTHER POINTS (PRESUMABLY 3s) AND LIST THEM HERE +### NEED TO CODE THIS ONCE SECTION IS ADDED +#set($numOtherPoints = ${list.size($thirdTier)}) +#if($numOtherPoints > 0) +..INCLUDING THE FOLLOWING LOCATIONS ## +#set($count = 0) +#foreach(${location} in ${thirdTier}) +#set($count = $count + 1) +${location.name}## +#if($count == $numOtherPoints - 1) + AND ## +#elseif($count < $numOtherPoints) +...## +#else +.## +#end +#end +#end + +#end +#end +#end + +## AUTHOR: EVAN BOOKBINDER +## OUTPUTS A STRING PADDED WITH WHITESPACE +## USED FOR COLUMN FORMATTING OF CITIES +#macro(padOutput $inString $width $lineFeed) +#set($ellipsesTest = $width - 3) +#if(${inString.length()} >= $ellipsesTest) +##return instead of output +#if(${lineFeed}) +${inString.substring(0,$ellipsesTest)}... +#else +${inString.substring(0,$ellipsesTest)}...## +#end +#else +${inString}...## +#if(${lineFeed} == 1) + +#else +#set($bufferSize = $ellipsesTest - ${inString.length()}) +#foreach ($buffer in [1..${bufferSize}]) + ## +#end +#end +#end +#end + +## AUTHOR: EVAN BOOKBINDER +## Updated by Phil Kurimski to fix an error with one location impacted +## This macro will output a location list based on the thresholds/parameters +## defined in the product's .xml configuration file +## 1 - LOCATIONS IMPACTED INCLUDE +## CROSSVILLE... +## COLLINSVILLE... +## 2 - LOCATIONS IMPACTED INCLUDE +## FAIRVIEW...CULLMAN... +## JOPPA...PHELAN... +## ARAB...WILBURN... +## 3 - LOCATIONS IN THE WARNING INCLUDE BUT ARE NOT LIMITED TO +## QUINTON...SUSAN MOORE...WEST JEFFERSON...WARRIOR...ROSA... +## FAIRVIEW...LOCUST FORK...TRAFFORD...ARGO...ANDERSON AND ALTON +## Inputs: bulletLead (string containing a lead-in to the list of cities e.g. LOCATIONS IMPACTED INCLUDE...) +## stormType (string containing the storm type e.g. SEVERE THUNDERSTORM) +## columns (number of columns to list the cities (0 is a normal ellipsees separated list) +## cityList (a single pointSource object containing a list of towns) +## areas (array of area objects (counties, parishes, etc...) +## dateUtil (date utility object) +## timeFormat (time formatting object) +## marineFlag (1 if marine product) +#macro(locationsList $bulletLead $ruralPhrase $columns $cityList $otherCityList $areas $dateUtil $timeFormat $marineFlag) +#set($numMajorPoints = ${list.size($cityList)}) +#if($numMajorPoints > 0) +${bulletLead} +#set($count = 0) +#set($colWidth = 67 / $columns) +#set($colCount = 0) +#foreach(${city} in ${cityList}) +#set($count = $count + 1) +#if($count < $numMajorPoints) +#set($strOutput = "${city.name}...") +#else +#set($strOutput = "${city.name}.") +#end +##Exception for 2 items in straight list +#if((${count} == ${numMajorPoints} - 1) && $columns == 0) +#set($strOutput = "${city.name} ") +#end +##STRAIGHT LIST +#if($columns == 0) +#if($numMajorPoints == 1) +${strOutput}## +#else +#if($count != $numMajorPoints) +${strOutput}## +#else +AND ${strOutput}## + +#end +#end +##ONE PER LINE +#elseif($columns == 1) +#if($count != $numMajorPoints) +${strOutput} +#else +AND ${strOutput} + +#end +##MULTIPLE COLUMNS +#else +#set($colCount = $colCount + 1) +#if($colCount != $columns) +#padOutput(${city.name} $colWidth 0) +#else +#padOutput(${city.name} $colWidth 1) +#set($colCount = 0) +#end +#end +#end +###ADD BLANK LINE AT END +#if($count > 0) + +#end +#else +#if($marineFlag == 1) +${ruralPhrase} WILL REMAIN OVER MAINLY OPEN WATERS. +#else +## NO MAJOR POINTS FOUND. LIST RURAL AREAS +${ruralPhrase} WILL REMAIN OVER MAINLY RURAL AREAS OF #headlineLocList(${areas} true true true false).## +#set($numMinorPoints = ${list.size($otherCityList)}) +#if(${numMinorPoints} == 1) +..INCLUDING THE COMMUNITY OF ## +#elseif(${numMinorPoints} > 1) +..INCLUDING THE COMMUNITIES OF ## +#else + +#end +#set($count = 0) +#foreach(${city} in ${otherCityList}) +#set($count = $count + 1) +#if(${count} < ${numMinorPoints} - 1) +${city.name}...## +#elseif(${count} == ${numMinorPoints} - 1) +${city.name} ## +#elseif (${count} == ${numMinorPoints} && ${count} != 1) +AND ${city.name}. +#elseif (${count} == ${numMinorPoints}) +${city.name}. + +#end +#end +#end +#end +#end diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.vm index a220954d4a..492ed4c1f8 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.vm @@ -5,6 +5,8 @@ ## Evan Bookbinder 9-16-2011 for OB11.8.0-8 ## ## Mike Dangelo 9-19-2011 at Alaska TIM ## ## Mike Dangelo 1-25-2012 at CRH TIM ## +## Evan Bookbinder 2-24-2012 ## +## Phil Kurimski 2-28-2012 for OB 12.2.1-3 ## ## #if(${action} == "EXT") #set($starttime = "000000T0000Z") @@ -47,7 +49,14 @@ #elseif(${list.contains($bullets, "IC")}) #set($ic = "IC") #elseif(${list.contains($bullets, "DR")}) - #set($ic = "DR") + #set($ic = "DR") + #set($hycType = "A DAM FLOODGATE RELEASE") +#elseif(${list.contains($bullets, "GO")}) + #set($ic = "GO") + #set($hycType = "A GLACIER-DAMMED LAKE OUTBURST") +#elseif(${list.contains($bullets, "OT")}) + #set($ic = "OT") + #set($hycType = "GROUND WATER FLOODING") #elseif(${list.contains($bullets, "rapidRiver")}) #set($hycType = "RAPID RIVER RISES") #elseif(${list.contains($bullets, "poorDrainage")}) @@ -105,9 +114,6 @@ ${advType} FOR... #if(${list.contains($bullets, "IC")}) #set ($cause = "AN ICE JAM AND HEAVY RAIN") #end -#if(${list.contains($bullets, "DR")}) - #set ($report = ". A DAM GATE FLOOD RELEASE WILL CREATE MINOR FLOODING") -#end #if(${list.contains($bullets, "rapidRiver")}) #set ($report2 = ". RAPID RIVER RISES WILL RESULT IN MINOR FLOODING") #end @@ -117,26 +123,26 @@ ${advType} FOR... #if(${list.contains($bullets, "doppler")}) #set ($report = "DOPPLER RADAR INDICATED ${cause} THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") #end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR INDICATED ${cause} DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") +#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "actual")}) + #set ($report = "DOPPLER RADAR INDICATED ${cause} CAUSING ${advTypeShort}${report2} IN THE ADVISORY AREA") #end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR INDICATED ${cause} DUE TO A LINE OF THUNDERSTORMS THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") +#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) + #set ($report = "DOPPLER RADAR INDICATED ${cause} DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") #end #if(${list.contains($bullets, "dopplerGauge")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} WHICH WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") +#end +#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "actual")}) + #set ($report = "DOPPLER RADAR INDICATED ${cause} CAUSING ${advTypeShort}${report2} IN THE ADVISORY AREA") #end #if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") -#end -#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} DUE TO A LINE OF THUNDERSTORMS THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") #end #if(${list.contains($bullets, "trainedSpotters")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "thunder")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} IN !** LOCATION **! DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}${report2}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "actual")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") @@ -148,7 +154,7 @@ ${advType} FOR... #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "thunder")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO A THUNDERSTORM IN THAT WILL CAUSE ${advTypeShort}${report2}") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "actual")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") @@ -156,17 +162,29 @@ ${advType} FOR... #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") #end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "actual")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") +#end #if(${list.contains($bullets, "public")}) - #set ($report = "${cause} WAS REPORTED TO BE CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") + #set ($report = "THE PUBLIC REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) - #set ($report = "A THUNDERSTORM WAS REPORTED IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}") + #set ($report = "THE PUBLIC REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "actual")}) - #set ($report = "${cause} WAS REPORTED TO BE CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") + #set ($report = "THE PUBLIC REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "${cause} WAS REPORTED IN !** LOCATION **! THAT WILL CAUSE MINOR FLOODING${report2}") + #set ($report = "THE PUBLIC REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "doppler")} || ${list.contains($bullets, "dopplerGauge")}) #set($estimate = "UP TO !** Number **! INCHES OF RAIN HAS FALLEN IN THE PAST HOUR.") @@ -226,20 +244,16 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS... #end ## -#if(${list.contains($bullets, "advisoryMeansCTA")}) -A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. - -#end #if(${list.contains($bullets, "dontdrownCTA")}) MOST FLOOD DEATHS OCCUR IN AUTOMOBILES. NEVER DRIVE YOUR VEHICLE INTO AREAS WHERE THE WATER COVERS THE ROADWAY. FLOOD WATERS ARE USUALLY DEEPER THAN THEY APPEAR. JUST ONE FOOT OF FLOWING WATER IS POWERFUL ENOUGH TO SWEEP VEHICLES OFF THE ROAD. WHEN ENCOUNTERING FLOODED ROADS MAKE THE SMART CHOICE...TURN AROUND...DONT DROWN. #end #if(${list.contains($bullets, "urbanCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE ELEVATED LEVELS ON SMALL CREEKS AND STREAMS...AND PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. #end #if(${list.contains($bullets, "ruralCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...HIGHWAYS AND UNDERPASSES. ADDITIONALLY...COUNTRY ROADS AND FARMLANDS ALONG THE BANKS OF CREEKS...STREAMS AND OTHER LOW LYING AREAS ARE SUBJECT TO FLOODING. +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...AS WELL AS FARM AND COUNTRY ROADS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. #end #if(${list.contains($bullets, "donotdriveCTA")}) @@ -257,12 +271,15 @@ DO NOT UNDERESTIMATE THE POWER OF FLOOD WATERS. ONLY A FEW INCHES OF RAPIDLY FLO #if(${list.contains($bullets, "reportFloodingCTA")}) TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE FORECAST OFFICE. +#end +#if(${list.contains($bullets, "advisoryMeansCTA")}) +A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED...OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. + #end #if(${ctaSelected} == "YES") && #end -#################################### END OF CTA STUFF ################################### #if(${productClass}=="T") THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml index 372b5a45d3..1d4bac0d0d 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory.xml @@ -1,8 +1,11 @@ - + Mike Dangelo 09-19-2011 at Alaska TIM + Mike Dangelo 01-25-2012 at CRH TIM + Evan Bookbinder 2-24-2012 for OB12.2.1 + Phil Kurimski 2-28-2012 for OB12.2.1-3 +-->@@ -86,12 +89,13 @@ + - - - - - + + + + + @@ -99,12 +103,12 @@ - + - + @@ -120,19 +124,20 @@ - + + - - - - - + + + + + @@ -140,12 +145,12 @@ - + - + @@ -161,19 +166,20 @@ @@ -214,6 +220,7 @@- + + - - - - - + + + + + @@ -181,12 +187,12 @@ - + - + false +true 8.0 @@ -221,14 +228,20 @@5 4 8 -Name +Name COUNTYNAME +STATE STATE countyTypes.txt + distance + + ++ @@ -237,17 +250,18 @@ +true 30 200 ++ + ++ - warngenlev population - - -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.vm index 3e7d41fb04..8831573928 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.vm @@ -3,8 +3,10 @@ ############################## ## EDITED BY PHIL KURIMSKI 8-18-2011 FOR OB11.8.0-4 ## EVAN BOOKBINDER 9-16-2011 FOR OB11.0.8-8 -## Mike Dangelo 09-19-2011 at Alaska TIM -## Mike and Phil 1-25-2012 at CRH TIM +## Mike Dangelo 9-19-2011 at Alaska TIM +## Mike and Phil 1-25-2012 at CRH TIM +## Evan Bookbinder 2-24-2012 +## Phil Kurimski 2-28-2012 for OB 12.2.1-3 ## #if(${action} == "EXT") #set($starttime = "000000T0000Z") @@ -54,32 +56,36 @@ #set ($cause = "AN ICE JAM") #set ($hycType = "FOR ICE JAM FLOODING ") #end +#if(${ic} == "DR") + #set ($cause = "A DAM FLOODGATE RELEASE") + #set ($hycType = "FOR A DAM FLOODGATE RELEASE ") +#end #if(${ic} == "IC") #set ($cause = "AN ICE JAM AND HEAVY RAIN") #end #if(${list.contains($bullets, "doppler")}) #set ($report = "DOPPLER RADAR INDICATED ${cause} THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") #end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR INDICATED ${cause} DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") +#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "actual")}) + #set ($report = "DOPPLER RADAR INDICATED ${cause} CAUSING ${advTypeShort}${report2} IN THE ADVISORY AREA") #end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR INDICATED ${cause} DUE TO A LINE OF THUNDERSTORMS THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") +#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) + #set ($report = "DOPPLER RADAR INDICATED ${cause} DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") #end #if(${list.contains($bullets, "dopplerGauge")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause}. THIS WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") +#end +#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "actual")}) + #set ($report = "DOPPLER RADAR INDICATED ${cause} CAUSING ${advTypeShort}${report2} IN THE ADVISORY AREA") #end #if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") -#end -#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} DUE TO A LINE OF THUNDERSTORMS THAT WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED ${cause} DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2} IN THE ADVISORY AREA") #end #if(${list.contains($bullets, "trainedSpotters")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "thunder")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} IN !** LOCATION **! DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}${report2}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "actual")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${advTypeShort} IN !** LOCATION **!${report2}") @@ -91,7 +97,7 @@ #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "thunder")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO A THUNDERSTORM IN THAT WILL CAUSE ${advTypeShort}${report2}") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "actual")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") @@ -99,17 +105,29 @@ #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") #end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}${report2}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "actual")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") +#end #if(${list.contains($bullets, "public")}) #set ($report = "THE PUBLIC REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) - #set ($report = "THE PUBLIC REPORTED ${advTypeShort} IN !** LOCATION **! DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}") + #set ($report = "THE PUBLIC REPORTED ${advTypeShort} IN !** LOCATION **! DUE TO THUNDERSTORMS. THIS WILL CAUSE ${advTypeShort}") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "actual")}) #set ($report = "THE PUBLIC REPORTED ${advTypeShort} IN !** LOCATION **!${report2}") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "THE PUBLIC REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE MINOR FLOODING${report2}") + #set ($report = "THE PUBLIC REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") #end #if(${list.contains($bullets, "doppler")} || ${list.contains($bullets, "dopplerGauge")}) #set($estimate = "UP TO !** Number **! INCHES OF RAIN HAS FALLEN IN THE PAST HOUR.") @@ -279,7 +297,7 @@ DO NOT UNDERESTIMATE THE POWER OF FLOOD WATERS. ONLY A FEW INCHES OF RAPIDLY FLO TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE FORECAST OFFICE. #end -#if(${list.contains($bullets, "advisoryMeans")}) +#if(${list.contains($bullets, "advisoryMeansCTA")}) A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. #end @@ -326,15 +344,12 @@ ${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} #if(${productClass}=="T") THIS IS A TEST MESSAGE.## #end -...THE ${advType} FOR ## -#headlineLocList(${cancelareas} true true true false) -...## +...THE ${advType} ${hycType}HAS BEEN CANCELLED FOR ## +#headlineLocList(${areas} true true true false)## +... ########### END NEW HEADLINE CODE #################### -## One line explanation - user can delete the one they don't want -## or delete both and explain why manually -!** THE HEAVY RAIN HAS ENDED. THEREFORE...THE FLOODING THREAT HAS ENDED. **! -!** THE FLOOD WATER IS RECEDING. THEREFORE...THE FLOODING THREAT HAS ENDED. **! +!** THE HEAVY RAIN HAS ENDED (AND/OR) FLOOD WATER IS RECEDING. THEREFORE...THE FLOODING THREAT HAS ENDED. **! #if(${productClass}=="T") THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. @@ -416,11 +431,11 @@ MOST FLOOD DEATHS OCCUR IN AUTOMOBILES. NEVER DRIVE YOUR VEHICLE INTO AREAS WHER #end #if(${list.contains($bullets, "urbanCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE ELEVATED LEVELS ON SMALL CREEKS AND STREAMS...AND PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. #end #if(${list.contains($bullets, "ruralCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...HIGHWAYS AND UNDERPASSES. ADDITIONALLY...COUNTRY ROADS AND FARMLANDS ALONG THE BANKS OF CREEKS...STREAMS AND OTHER LOW LYING AREAS ARE SUBJECT TO FLOODING. +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...AS WELL AS FARM AND COUNTRY ROADS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. #end #if(${list.contains($bullets, "donotdriveCTA")}) @@ -440,7 +455,7 @@ TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT T #end #if(${list.contains($bullets, "advisoryMeansCTA")}) -A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. +A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED...OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. #end #if(${ctaSelected} == "YES") @@ -449,10 +464,6 @@ A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN #end #################################### END OF CTA STUFF ################################### #end - -#################################### -## END OF FLOOD ADVISORY PRODUCTS ## -#################################### #if(${productClass}=="T") THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml index b1074df661..4d0fe2281b 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup.xml @@ -3,6 +3,8 @@ Evan Bookbinder 09-16-2011 for 11.8.0-8 Mike Dangelo 09-19-2011 at Alaska TIM Mike and Phil 01-25-2012 at CRH TIM + Evan Bookbinder 09-16-2011 for OB11.8.0-8 + Phil Kurimski 03-02-2012 for OB12.1.1-4 -->@@ -58,14 +60,14 @@ - + - - + + @@ -73,20 +75,20 @@ - + - - + + @@ -178,6 +182,7 @@ - + @@ -97,12 +99,13 @@ + - - - - - + + + + + @@ -110,7 +113,7 @@ - + @@ -132,12 +135,13 @@ + - - - - - + + + + + @@ -145,12 +149,12 @@ - + - + false +- true 8.0 @@ -193,25 +198,31 @@+ distance + + ++ + + NAME POINTS true 30 200 ++ + ++ - warngenlev population - - -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.vm index ffcd7e6bc3..90a16c0d64 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.vm @@ -3,6 +3,7 @@ #################################### ## Created by Mike Dangelo 09-19-2011 at Alaska TIM for zones ## Edited by Mike Dangelo 01-26-2012 at CRH TIM +## Edited by Phil Kurimski 2-29-2012 ## #if(${action} == "EXT") #set($starttime = "000000T0000Z") @@ -30,7 +31,7 @@ #end #if(${ic} == "SM") #set($hycType = "FOR MELTING SNOW IN") -#elseif({$ic} == "RS") +#elseif(${ic} == "RS") #set($hycType = "FOR RAIN AND MELTING SNOW IN") #elseif(${ic} == "IJ") #set($hycType = "FOR ICE JAM FLOODING IN") @@ -117,6 +118,12 @@ #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "plainRain")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") #end +#if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "glacierOutburst")}) + #set ($report = "A TRAINED SPOTTER REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") +#end +#if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "groundWater")}) + #set ($report = "A TRAINED SPOTTER REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") +#end #if(${list.contains($bullets, "lawEnforcement")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end @@ -129,6 +136,30 @@ #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${report2}") #end +#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "glacierOutburst")}) + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") +#end +#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "groundWater")}) + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") +#end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO A THUNDERSTORM IN THAT WILL CAUSE ${advTypeShort}${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "actual")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "glacierOutburst")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "groundWater")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") +#end #if(${list.contains($bullets, "public")}) #set ($report = "THE PUBLIC REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${report2}") #end @@ -141,6 +172,12 @@ #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "plainRain")}) #set ($report = "THE PUBLIC REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE MINOR FLOODING${report2}") #end +#if(${list.contains($bullets, "public")} && ${list.contains($bullets, "glacierOutburst")}) + #set ($report = "THE PUBLIC REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") +#end +#if(${list.contains($bullets, "public")} && ${list.contains($bullets, "groundWater")}) + #set ($report = "THE PUBLIC REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") +#end #if(${list.contains($bullets, "doppler")} || ${list.contains($bullets, "dopplerGauge")}) #set($estimate = "UP TO !** Number **! INCHES OF RAIN HAS FALLEN IN THE PAST HOUR.") #else @@ -379,7 +416,7 @@ ${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} #if(${productClass}=="T") THIS IS A TEST MESSAGE.## #end -...THE ${advType} FOR ## +...THE ${advType} ${hycType}HAS BEEN CANCELLED FOR ## #headlineLocList(${cancelareas} true true true false) ...## ########### END NEW HEADLINE CODE #################### @@ -453,6 +490,7 @@ ADDITIONAL RAINFALL OF !** Edit Amount **! INCHES IS EXPECTED OVER THE AREA. TH MINOR FLOODING IS OCCURRING NEAR !** Enter Location **!. #end + #if(${list.contains($bullets, "drainages")}) #drainages(${riverdrainages}) @@ -499,7 +537,7 @@ TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT T #end #if(${list.contains($bullets, "advisoryMeansCTA")}) -A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. KEEP AN EYE ON WATERWAYS AND BE PREPARED TO TAKE ACTION. +A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED...OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. #end #if(${ctaSelected} == "YES") @@ -507,10 +545,6 @@ A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN #end #################################### END OF CTA STUFF ################################### -#if(${list.contains($bullets, "advMeans")}) -A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. - -#end #end #################################### ## END OF FLOOD ADVISORY PRODUCTS ## diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml index 268e09ab9d..5ac13ae050 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisoryFollowup_Zones.xml @@ -1,7 +1,8 @@ - +@@ -98,6 +99,7 @@ + @@ -143,6 +145,7 @@ + @@ -209,6 +212,7 @@ false +- true 8.0 @@ -225,25 +229,31 @@+ distance + + ++ + + NAME POINTS true 30 200 ++ + ++ - warngenlev population -- +- -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.vm index 67ecc8dad0..dd8ec52358 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.vm @@ -4,6 +4,7 @@ ## Created by Mike Dangelo 9-21-2011 at Alaska TIM ## ## Mary-Beth Schreck, Ed Plumb, Aaron Jacobs 9-22-2011 at Alaska TIM ## Mike Dangelo 01-26-2012 at CRH TIM +## Phil Kurimski 2-29-2012 ## #if(${action} == "EXT") #set($starttime = "000000T0000Z") @@ -193,6 +194,18 @@ THIS IS A TEST MESSAGE. ## #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${typeofevent}") #end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! DUE TO A THUNDERSTORM IN THAT WILL CAUSE ${advTypeShort}${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "actual")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${typeofevent}") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED ${cause} IN !** LOCATION **! THAT WILL CAUSE ${advTypeShort}${typeofevent}") +#end #if(${list.contains($bullets, "public")}) #set ($report = "THE PUBLIC REPORTED ${cause} CAUSING ${advTypeShort} IN !** LOCATION **!${typeofevent}") #end @@ -209,10 +222,16 @@ THIS IS A TEST MESSAGE. ## #set ($report = "A TRAINED SPOTTER REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "glacierOutburst")}) - #set ($report = "LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "groundWater")}) - #set ($report = "LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "glacierOutburst")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "groundWater")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) #set ($report = "THE PUBLIC REPORTED ${advTypeShort} IN !** LOCATION **! DUE TO A THUNDERSTORM THAT WILL CAUSE ${advTypeShort}") @@ -272,6 +291,7 @@ ADDITIONAL RAINFALL OF !** Edit Amount **! INCHES IS EXPECTED OVER THE AREA. TH MINOR FLOODING IS OCCURRING NEAR !** Enter Location **!. #end + #if(${list.contains($bullets, "drainages")}) #drainages(${riverdrainages}) @@ -292,10 +312,6 @@ MINOR FLOODING IS OCCURRING NEAR !** Enter Location **!. #if(${ctaSelected} == "YES") PRECAUTIONARY/PREPAREDNESS ACTIONS... -#end -#if(${list.contains($bullets, "advisoryMeansCTA")}) -A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. - #end #if(${list.contains($bullets, "dontdrownCTA")}) MOST FLOOD DEATHS OCCUR IN AUTOMOBILES. NEVER DRIVE YOUR VEHICLE INTO AREAS WHERE THE WATER COVERS THE ROADWAY. FLOOD WATERS ARE USUALLY DEEPER THAN THEY APPEAR. JUST ONE FOOT OF FLOWING WATER IS POWERFUL ENOUGH TO SWEEP VEHICLES OFF THE ROAD. WHEN ENCOUNTERING FLOODED ROADS MAKE THE SMART CHOICE...TURN AROUND...DONT DROWN. @@ -324,6 +340,10 @@ DO NOT UNDERESTIMATE THE POWER OF FLOOD WATERS. ONLY A FEW INCHES OF RAPIDLY FLO #if(${list.contains($bullets, "reportFloodingCTA")}) TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE FORECAST OFFICE. +#end +#if(${list.contains($bullets, "advisoryMeansCTA")}) +A FLOOD ADVISORY MEANS RIVER OR STREAM FLOWS ARE ELEVATED...OR PONDING OF WATER IN URBAN OR OTHER AREAS IS OCCURRING OR IS IMMINENT. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. + #end #if(${ctaSelected} == "YES") && diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml index d21b21b352..9ebaa9cafb 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodAdvisory_Zones.xml @@ -1,7 +1,8 @@ + Mike Dangelo 01-26-2012 at CRH TIM + Phil Kurimski 2-29-2012 -->@@ -82,7 +83,7 @@ - + @@ -90,7 +91,8 @@ - + + @@ -107,7 +109,7 @@ - + @@ -135,7 +137,7 @@ - + @@ -143,7 +145,8 @@ - + + @@ -160,7 +163,7 @@ - + @@ -188,7 +191,7 @@ - + @@ -196,7 +199,8 @@ - + + @@ -213,7 +217,7 @@ - + @@ -260,6 +264,7 @@ false +- true 8.0 @@ -278,23 +283,24 @@+ + NAME POINTS true 30 200 ++ + ++ - warngenlev population -- +- -- + NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.vm index fb8ec66dfd..1cc8c788f0 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.vm @@ -4,7 +4,8 @@ ## EDITED BY MIKE DANGELO 7-13-2011 ## ## Edited by Phil Kurimski 8-16-2011 R11.8 ## ## EDITED BY MIKE DANGELO 9-19-2011 at Alaska TIM ## -## +## EDITED BY Evan Bookbinder 2-24-2012 +## EDITED BY Phil Kurimski 2-28-2012 #################################### SET SOME VARIABLES ################################### ## #if(${action} == "EXT") @@ -104,53 +105,59 @@ THIS IS A TEST MESSAGE. ## #end #secondBullet(${dateUtil},${expire},${timeFormat},${localtimezone},${secondtimezone}) -#set ($report = "HEAVY RAIN THAT WILL CAUSE FLOODING.") +#set ($report = "!**YOU DID NOT SELECT AN /EVENT/ BULLET. PLEASE CLOSE THIS WINDOW AND REGENERATE YOUR WARNING**!") #set ($rainAmount = "") #if(${list.contains($bullets, "doppler")}) #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN THAT WILL CAUSE FLOODING.") #end #if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO A THUNDERSTORM THAT WILL CAUSE FLOODING.") -#end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO A LINE OF THUNDERSTORMS. THE HEAVY RAIN WILL CAUSE FLOODING.") + #set ($report = "DOPPLER RADAR INDICATED THUNDERSTORMS PRODUCING HEAVY RAIN WHICH WILL CAUSE FLOODING.") #end #if(${list.contains($bullets, "dopplerGauge")}) #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA. THAT HEAVY RAIN WILL CAUSE FLOODING.") #end #if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT A THUNDERSTORM IS PRODUCING HEAVY RAIN OVER THE AREA. THAT RAIN WILL CAUSE FLOODING.") -#end -#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT A LINE OF THUNDERSTORMS IS PRODUCING HEAVY RAIN OVER THE AREA. THAT RAIN WILL CAUSE FLOODING.") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THUNDERSTORMS WITH HEAVY RAIN OVER THE AREA. THAT RAIN WILL CAUSE FLOODING.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "thunder")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! DUE TO A THUNDERSTORM THAT WILL CAUSE FLOODING.") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! DUE TO THUNDERSTORMS THAT WILL CAUSE FLOODING.") #end -#if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "floodReport")}) +#if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "floodOccurring")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED FLOODING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "plainRain")}) #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! THAT WILL CAUSE FLOODING.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "thunder")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN DUE TO A THUNDERSTORM OVER !** LOCATION **! THAT WILL CAUSE FLOODING.") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED THUNDERSTORMS WITH HEAVY RAIN OVER !** LOCATION **! THAT WILL CAUSE FLOODING.") #end -#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "floodReport")}) +#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "floodOccurring")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED FLOODING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **! THAT WILL CAUSE FLOODING.") #end -#if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) - #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **! DUE TO A THUNDERSTORM. THE HEAVY RAIN WILL CAUSE FLOODING.") +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED THUNDERSTORMS WITH HEAVY RAIN IN !** LOCATION **!. THE HEAVY RAIN WILL CAUSE FLOODING.") #end -#if(${list.contains($bullets, "public")} && ${list.contains($bullets, "floodReport")}) +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "floodOccurring")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED FLOODING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN IN !** LOCATION **!. THE HEAVY RAIN WILL CAUSE FLOODING.") +#end +#if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) + #set ($report = "THE PUBLIC REPORTED THUNDERSTORMS WITH HEAVY RAIN IN !** LOCATION **!. THE HEAVY RAIN WILL CAUSE FLOODING.") +#end +#if(${list.contains($bullets, "public")} && ${list.contains($bullets, "floodOccurring")}) #set ($report = "THE PUBLIC REPORTED FLOODING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "plainRain")}) #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **!. THAT HEAVY RAIN WILL CAUSE FLOODING.") #end +#if(${list.contains($bullets, "genericFlood")}) + #set ($report = "!** ENTER REASON AND FORECAST FOR FLOOD **!") +#end #if(${list.contains($bullets, "rain1")} ) #set ($rainAmount = "UP TO ONE INCH OF RAIN HAS ALREADY FALLEN.") #end @@ -183,7 +190,11 @@ AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${repor #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end -#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE" "THIS FLOODING" 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#### THE THIRD ARGUMENT IS A NUMBER SPECIFYING THE NUMBER OF COLUMNS TO OUTPUT THE CITIES LIST IN +#### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT +#### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE +#### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! +#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE..." "THIS FLOODING" 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) #end @@ -233,16 +244,20 @@ MOST FLOOD DEATHS OCCUR IN AUTOMOBILES. NEVER DRIVE YOUR VEHICLE INTO AREAS WHER #end #if(${list.contains($bullets, "urbanCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE ELEVATED LEVELS ON SMALL CREEKS AND STREAMS...AND PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. #end #if(${list.contains($bullets, "ruralCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE ELEVATED LEVELS ON SMALL CREEKS AND STREAMS...AND PONDING OF WATER ON COUNTRY ROADS AND FARMLAND ALONG THE BANKS OF CREEKS AND STREAMS. +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...AS WELL AS FARM AND COUNTRY ROADS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. #end #if(${list.contains($bullets, "USS_CTA")}) EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...HIGHWAYS AND UNDERPASSES IN URBAN AREAS. ADDITIONALLY...COUNTRY ROADS AND FARMLANDS ALONG THE BANKS OF CREEKS...STREAMS AND OTHER LOW LYING AREAS ARE SUBJECT TO FLOODING. +#end +#if(${list.contains($bullets, "specificCTA")}) +FLOOD WATERS ARE MOVING DOWN !**name of channel**! FROM !**location**! TO !**location**!. THE FLOOD CREST IS EXPECTED TO REACH !**location(s)**! BY !**time(s)**!. + #end #if(${list.contains($bullets, "nightCTA")}) BE ESPECIALLY CAUTIOUS AT NIGHT WHEN IT IS HARDER TO RECOGNIZE THE DANGERS OF FLOODING. IF FLOODING IS OBSERVED ACT QUICKLY. MOVE UP TO HIGHER GROUND TO ESCAPE FLOOD WATERS. DO NOT STAY IN AREAS SUBJECT TO FLOODING WHEN WATER BEGINS RISING. diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml index 5b6e623ba5..dfa51957e9 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning.xml @@ -1,7 +1,10 @@ + Mike Dangelo 01-25-2012 at CRH TIM + Evan Bookbinder 2-24-2012 + Phil Kurimski 2-28-2012 +-->@@ -14,7 +17,7 @@ that can be loaded with each template. --> - + @@ -62,7 +65,7 @@- + @@ -73,22 +76,28 @@ - + - + + + + - - - + + + + - + @@ -96,8 +105,8 @@ - - + + @@ -123,28 +132,35 @@ - + - + + + + - - - + + + + - + + - + - + @@ -172,28 +188,35 @@ - + - + + + + - - - + + + + - + + - + - + @@ -233,25 +256,25 @@ true 30 200 ++ + ++ - warngenlev population - - -- @@ -262,6 +285,7 @@ and place into this template --> NAME -TRACK +POINTS true -50 -10 +30 +200 - warngenlev population false +true 8.0 @@ -277,6 +301,11 @@ and place into this template -->+ distance + + ++ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.vm index ea549da681..b10f0d77ba 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.vm @@ -4,7 +4,8 @@ ## Edited by Evan Bookbinder 9-16-2011 FOR OB11.8.0-8 ## ## EDITED BY MIKE DANGELO 9-19-2011 at Alaska TIM ## ## EDITED BY MIKE DANGELO 1-25-2012 at CRH TIM ## -## +## EDITED BY EVAN BOOKBINDER 2-24-2012 ## +## EDITED BY PHIL KURIMSKI 2-28-2012 ## #################################### SET SOME VARs ################################### #set ($hycType = "") #set ($floodReason = "") @@ -206,17 +207,14 @@ REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimez THIS IS A TEST MESSAGE. ## #end #set($cityListLead = "RUNOFF FROM THIS EXCESSIVE RAINFALL WILL CAUSE ${floodType} TO OCCUR. ") -#if(${list.contains($bullets, "thunder")}) #thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...## +#if(${list.contains($bullets, "thunder")}) ${reportBy} SLOW MOVING THUNDERSTORMS WITH VERY HEAVY RAINFALL ACROSS THE WARNED AREA.${rainAmount}${floodReason} #elseif(${list.contains($bullets, "plainRain")}) -#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...## ${reportBy} AN AREA OF VERY HEAVY RAINFALL ACROSS THE WARNED AREA.${rainAmount}${floodReason} #elseif(${list.contains($bullets, "floodOccurring")}) -#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...## ${reportBy} ${floodType} ACROSS THE WARNED AREA.${rainAmount}${floodReason} !** ENTER SPECIFIC REPORTS OF FLOODING AND EXPECTED RAINFALL AMOUNTS **! #elseif(${list.contains($bullets, "genericFlood")}) -#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...## !** ENTER REASON AND FORECAST FOR FLOOD **! #else !**YOU DID NOT SELECT AN /EVENT/ BULLET. PLEASE CLOSE THIS WINDOW AND REGENERATE YOUR WARNING**! @@ -225,6 +223,7 @@ ${reportBy} ${floodType} ACROSS THE WARNED AREA.${rainAmount}${floodReason} !** ############################################ ######## (CITY LIST) ######### ############################################ +#if(${list.contains($bullets, "listofcities")}) #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end @@ -232,9 +231,9 @@ THIS IS A TEST MESSAGE. ## #### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT #### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE #### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! -##${cityListLead} -#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE" "THIS FLOODING" 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE..." "THIS FLOODING" 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#end ########################################## END OF OPTIONAL FOURTH BULLET ############################## ###################################### ###### WHERE ADDITIONAL INFO GOES #### @@ -271,52 +270,52 @@ FLOOD WATERS ARE MOVING DOWN !**name of channel**! FROM !**location**! TO !**loc PRECAUTIONARY/PREPAREDNESS ACTIONS... #end -#if(${list.contains($bullets, "urbanFloodingCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER DRAINAGE AREAS AND LOW LYING SPOTS. +#if(${list.contains($bullets, "warningMeansCTA")}) +A FLOOD WARNING MEANS THAT FLOODING IS IMMINENT OR HAS BEEN REPORTED. STREAM RISES WILL BE SLOW AND FLASH FLOODING IS NOT EXPECTED. HOWEVER...ALL INTERESTED PARTIES SHOULD TAKE NECESSARY PRECAUTIONS IMMEDIATELY. #end -#if(${list.contains($bullets, "ruralFloodingCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...COUNTRY ROADS...AS WELL AS FARMLAND AS WELL AS OTHER DRAINAGE AREAS AND LOW LYING SPOTS. - -#end -#if(${list.contains($bullets, "ruralUrbanCTA")}) -EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...HIGHWAYS AND UNDERPASSES. ADDITIONALLY...COUNTRY ROADS AND FARMLANDS ALONG THE BANKS OF CREEKS...STREAMS AND OTHER LOW LYING AREAS ARE SUBJECT TO FLOODING. - -#end -#if(${list.contains($bullets, "nighttimeCTA")}) -BE ESPECIALLY CAUTIOUS AT NIGHT WHEN IT IS HARDER TO RECOGNIZE THE DANGERS OF FLOODING. IF ${floodType} IS OBSERVED ACT QUICKLY. MOVE UP TO HIGHER GROUND TO ESCAPE FLOOD WATERS. DO NOT STAY IN AREAS SUBJECT TO FLOODING WHEN WATER BEGINS RISING. - -#end -#if(${list.contains($bullets, "dontDriveCTA")}) -DO NOT DRIVE YOUR VEHICLE INTO AREAS WHERE THE WATER COVERS THE ROADWAY. THE WATER DEPTH MAY BE TOO GREAT TO ALLOW YOUR CAR TO CROSS SAFELY. MOVE TO HIGHER GROUND. - -#end -#if(${list.contains($bullets, "turnAroundCTA")}) +#if(${list.contains($bullets, "dontdrownCTA")}) MOST FLOOD DEATHS OCCUR IN AUTOMOBILES. NEVER DRIVE YOUR VEHICLE INTO AREAS WHERE THE WATER COVERS THE ROADWAY. FLOOD WATERS ARE USUALLY DEEPER THAN THEY APPEAR. JUST ONE FOOT OF FLOWING WATER IS POWERFUL ENOUGH TO SWEEP VEHICLES OFF THE ROAD. WHEN ENCOUNTERING FLOODED ROADS MAKE THE SMART CHOICE...TURN AROUND...DONT DROWN. #end -#if(${list.contains($bullets, "autoSafetyCTA")}) -FLOODING IS OCCURRING OR IS IMMINENT. MOST FLOOD RELATED DEATHS OCCUR IN AUTOMOBILES. DO NOT ATTEMPT TO CROSS WATER COVERED BRIDGES...DIPS... OR LOW WATER CROSSINGS. NEVER TRY TO CROSS A FLOWING STREAM...EVEN A SMALL ONE...ON FOOT. TO ESCAPE RISING WATER FIND ANOTHER ROUTE OVER HIGHER GROUND. +#if(${list.contains($bullets, "urbanCTA")}) +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE PONDING OF WATER IN URBAN AREAS...HIGHWAYS...STREETS AND UNDERPASSES AS WELL AS OTHER POOR DRAINAGE AREAS AND LOW LYING SPOTS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. #end -#if(${list.contains($bullets, "camperSafetyCTA")}) -FLOODING IS OCCURRING OR IS IMMINENT. IT IS IMPORTANT TO KNOW WHERE YOU ARE RELATIVE TO STREAMS...RIVERS...OR CREEKS WHICH CAN BECOME KILLERS IN HEAVY RAINS. CAMPERS AND HIKERS SHOULD AVOID STREAMS OR CREEKS. +#if(${list.contains($bullets, "ruralCTA")}) +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...AS WELL AS FARM AND COUNTRY ROADS. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. #end -#if(${list.contains($bullets, "lowSpotsCTA")}) -IN HILLY TERRAIN THERE ARE HUNDREDS OF LOW WATER CROSSINGS WHICH ARE POTENTIALLY DANGEROUS IN HEAVY RAIN. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND AN ALTERNATE ROUTE. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. +#if(${list.contains($bullets, "USS_CTA")}) +EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...HIGHWAYS AND UNDERPASSES IN URBAN AREAS. ADDITIONALLY...COUNTRY ROADS AND FARMLANDS ALONG THE BANKS OF CREEKS...STREAMS AND OTHER LOW LYING AREAS ARE SUBJECT TO FLOODING. #end -#if(${list.contains($bullets, "flwMeansCTA")}) -A FLOOD WARNING MEANS THAT FLOODING IS IMMINENT OR OCCURRING. IF YOU ARE IN THE WARNING AREA MOVE TO HIGHER GROUND IMMEDIATELY. RESIDENTS LIVING ALONG STREAMS AND CREEKS SHOULD TAKE IMMEDIATE PRECAUTIONS TO PROTECT LIFE AND PROPERTY. DO NOT ATTEMPT TO CROSS SWIFTLY FLOWING WATERS OR WATERS OF UNKNOWN DEPTH BY FOOT OR BY AUTOMOBILE. +#if(${list.contains($bullets, "specificCTA")}) +FLOOD WATERS ARE MOVING DOWN !**name of channel**! FROM !**location**! TO !**location**!. THE FLOOD CREST IS EXPECTED TO REACH !**location(s)**! BY !**time(s)**!. #end -#if(${list.contains($bullets, "powerFloodCTA")}) +#if(${list.contains($bullets, "nightCTA")}) +BE ESPECIALLY CAUTIOUS AT NIGHT WHEN IT IS HARDER TO RECOGNIZE THE DANGERS OF FLOODING. IF FLOODING IS OBSERVED ACT QUICKLY. MOVE UP TO HIGHER GROUND TO ESCAPE FLOOD WATERS. DO NOT STAY IN AREAS SUBJECT TO FLOODING WHEN WATER BEGINS RISING. + +#end +#if(${list.contains($bullets, "donotdriveCTA")}) +DO NOT DRIVE YOUR VEHICLE INTO AREAS WHERE THE WATER COVERS THE ROADWAY. THE WATER DEPTH MAY BE TOO GREAT TO ALLOW YOUR CAR TO CROSS SAFELY. MOVE TO HIGHER GROUND. + +#end +#if(${list.contains($bullets, "camperCTA")}) +FLOODING IS OCCURRING OR IS IMMINENT. IT IS IMPORTANT TO KNOW WHERE YOU ARE RELATIVE TO STREAMS...RIVERS...OR CREEKS WHICH CAN BECOME KILLERS IN HEAVY RAINS. CAMPERS AND HIKERS SHOULD AVOID STREAMS OR CREEKS. + +#end +#if(${list.contains($bullets, "lowspotsCTA")}) +IN HILLY TERRAIN THERE ARE HUNDREDS OF LOW WATER CROSSINGS WHICH ARE POTENTIALLY DANGEROUS IN HEAVY RAIN. DO NOT ATTEMPT TO TRAVEL ACROSS FLOODED ROADS. FIND ALTERNATE ROUTES. IT TAKES ONLY A FEW INCHES OF SWIFTLY FLOWING WATER TO CARRY VEHICLES AWAY. + +#end +#if(${list.contains($bullets, "powerCTA")}) DO NOT UNDERESTIMATE THE POWER OF FLOOD WATERS. ONLY A FEW INCHES OF RAPIDLY FLOWING WATER CAN QUICKLY CARRY AWAY YOUR VEHICLE. #end #if(${list.contains($bullets, "reportFloodingCTA")}) -TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE. +TO REPORT FLOODING...HAVE THE NEAREST LAW ENFORCEMENT AGENCY RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE FORECAST OFFICE. #end #if(${ctaSelected} == "YES") diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml index f15b4120cf..11c69f5810 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarningFollowup.xml @@ -1,6 +1,9 @@ + Edited by Mike Dangelo 01-25-2012 at CRH TIM + Edited by Evan Bookbinder 2-24-2012 + Edited by Phil Kurimski 2-28-2012 +--> @@ -13,7 +16,7 @@ that can be loaded with each template. --> - + @@ -81,42 +84,43 @@- - + + - - - - + + + + - + + - - - - - - - - - - - + + + + + + + + + + + @@ -134,33 +138,34 @@ - - - - + + + + - + + - - - - - - - - - - - + + + + + + + + + + + @@ -191,6 +196,7 @@ false +- true 8.0 @@ -207,39 +213,40 @@+ distance + + ++ + + + + +NAME +POINTS +true +30 +200 ++ ++ ++ + +warngenlev +population +- - NAME POINTS true 30 200 - -warngenlev population - -- -- - - +NAME -POINTS -true -10 -200 -- -name -- - -- @@ -81,6 +82,7 @@ --> + @@ -103,27 +106,31 @@ + + - + + + - - - - - - - - - - - - + + + + + + + + + + + + @@ -133,6 +140,7 @@ --> + @@ -155,29 +164,33 @@ + + - + + + - - - - - - - - - - - - + + + + + + + + + + + + - + @@ -216,6 +229,7 @@ false +true 8.0 @@ -232,6 +246,11 @@+ distance + + ++ @@ -240,17 +259,18 @@ +true 30 200 ++ + ++ - warngenlev population -- +- -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.vm index 5e990ed942..e7920874f6 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.vm @@ -2,7 +2,7 @@ ## Created BY Mike Dangelo 9-19-2011 at Alaska TIM for zone code issuances ## ## Mary-Beth Schreck, Ed Plumb, Aaron Jacobs 9-23-2011 at Alaska TIM ## edited by Mike Dangelo 01-26-2012 at CRH TIM - +## edited by Phil Kurimski 2-29-2012 #################################### SET SOME VARIABLES ################################### #if(${action} == "EXT") #set($starttime = "000000T0000Z") @@ -159,6 +159,15 @@ THIS IS A TEST MESSAGE. ## #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **! THAT WILL CAUSE FLOODING.") #end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN DUE TO A THUNDERSTORM OVER !** LOCATION **! THAT WILL CAUSE FLOODING.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "floodReport")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED FLOODING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN IN !** LOCATION **! THAT WILL CAUSE FLOODING.") +#end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **! DUE TO A THUNDERSTORM. THE HEAVY RAIN WILL CAUSE FLOODING.") #end @@ -181,10 +190,16 @@ THIS IS A TEST MESSAGE. ## #set ($report = "A TRAINED SPOTTER REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "glacierOutburst")}) - #set ($report = "LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD.") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "groundWater")}) - #set ($report = "LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS.") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "glacierOutburst")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO A GLACIER-DAMMED LAKE OUTBURST FLOOD.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "groundWater")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED MINOR FLOODING IN !** LOCATION **! DUE TO RISING GROUND WATER LEVELS.") #end #if(${list.contains($bullets, "rain1")} ) #set ($rainAmount = "UP TO ONE INCH OF RAIN HAS ALREADY FALLEN.") @@ -263,7 +278,7 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS... #end ## -#if(${list.contains($bullets, "warningMeans")}) +#if(${list.contains($bullets, "warningMeansCTA")}) A FLOOD WARNING MEANS THAT FLOODING IS IMMINENT OR HAS BEEN REPORTED. STREAM RISES WILL BE SLOW AND FLASH FLOODING IS NOT EXPECTED. HOWEVER...ALL INTERESTED PARTIES SHOULD TAKE NECESSARY PRECAUTIONS IMMEDIATELY. #end @@ -282,6 +297,10 @@ EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE ELEVATED LEVELS ON SMALL CREEKS #if(${list.contains($bullets, "USS_CTA")}) EXCESSIVE RUNOFF FROM HEAVY RAINFALL WILL CAUSE FLOODING OF SMALL CREEKS AND STREAMS...HIGHWAYS AND UNDERPASSES IN URBAN AREAS. ADDITIONALLY...COUNTRY ROADS AND FARMLANDS ALONG THE BANKS OF CREEKS...STREAMS AND OTHER LOW LYING AREAS ARE SUBJECT TO FLOODING. +#end +#if(${list.contains($bullets, "particularStreamCTA")}) +FLOOD WATERS ARE MOVING DOWN !**name of channel**! FROM !**location**! TO !**location**!. THE FLOOD CREST IS EXPECTED TO REACH !**location(s)**! BY !**time(s)**!. + #end #if(${list.contains($bullets, "specificCTA")}) FLOOD WATERS ARE MOVING DOWN !**name of channel**! FROM !**location**! TO !**location**!. THE FLOOD CREST IS EXPECTED TO REACH !**location(s)**! BY !**time(s)**!. @@ -294,6 +313,10 @@ BE ESPECIALLY CAUTIOUS AT NIGHT WHEN IT IS HARDER TO RECOGNIZE THE DANGERS OF FL #if(${list.contains($bullets, "donotdriveCTA")}) DO NOT DRIVE YOUR VEHICLE INTO AREAS WHERE THE WATER COVERS THE ROADWAY. THE WATER DEPTH MAY BE TOO GREAT TO ALLOW YOUR CAR TO CROSS SAFELY. MOVE TO HIGHER GROUND. +#end +#if(${list.contains($bullets, "autoSafetyCTA")}) +FLOODING IS OCCURRING OR IS IMMINENT. MOST FLOOD RELATED DEATHS OCCUR IN AUTOMOBILES. DO NOT ATTEMPT TO CROSS WATER COVERED BRIDGES...DIPS... OR LOW WATER CROSSINGS. NEVER TRY TO CROSS A FLOWING STREAM...EVEN A SMALL ONE...ON FOOT. TO ESCAPE RISING WATER FIND ANOTHER ROUTE OVER HIGHER GROUND. + #end #if(${list.contains($bullets, "camperCTA")}) FLOODING IS OCCURRING OR IS IMMINENT. IT IS IMPORTANT TO KNOW WHERE YOU ARE RELATIVE TO STREAMS...RIVERS...OR CREEKS WHICH CAN BECOME KILLERS IN HEAVY RAINS. CAMPERS AND HIKERS SHOULD AVOID STREAMS OR CREEKS. diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml index 1ef7a70518..172aecd894 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/arealFloodWarning_Zones.xml @@ -1,7 +1,8 @@ - +@@ -14,7 +15,7 @@ that can be loaded with each template. --> - + @@ -74,32 +75,34 @@+ + - - + - - + + - - - - + + + + + - + @@ -107,6 +110,7 @@ + @@ -131,32 +135,34 @@ + + - - + - - + + - - - - + + + + + - + @@ -164,6 +170,7 @@ + @@ -188,32 +195,34 @@ + + - - + - - + + - - - - + + + + + - + @@ -221,6 +230,7 @@ + @@ -262,6 +272,7 @@ false +true 8.0 @@ -278,6 +289,11 @@+ distance + + ++ @@ -286,17 +302,18 @@ +true 30 200 ++ + ++ - warngenlev population -- +- -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml index 88e361b1ce..8d6cef67e6 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarning.xml @@ -174,6 +174,11 @@+ distance + + ++ @@ -182,6 +187,11 @@ - + +true 20 10 ++ + ++ warngenlev population diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.vm index 3bcc1eb7c5..2c1a5be9bb 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.vm @@ -12,6 +12,14 @@ #set($expcanHLTag = "IS CANCELLED") #end ############# +## EWW COR ## +############# +#if(${specialCorText}) +${WMOId} ${vtecOffice} 000000 ${BBBId} +SVS${siteId} +${specialCorText} +#else +############# ## EWW CAN ## ############# #if(${action}=="CAN") @@ -184,6 +192,10 @@ THIS IS A TEST MESSAGE. ## #locationsList("LOCATIONS IMPACTED INCLUDE..." "${phenomena} ARE EXPECTED TO REMAIN OVER MAINLY RURAL AREAS OF" 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) #end +############################################## +###### mile markers ############## +############################################## +#parse("milemarkers.vm") ##################### ## CALL TO ACTIONS ## ##################### @@ -383,10 +395,10 @@ THIS IS A TEST MESSAGE. ## #locationsList("LOCATIONS IMPACTED INCLUDE..." ${phenomena} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) #end - -## parse file command here is to pull in mile marker info -## #parse("mileMarkers.vm") - +############################################## +###### mile markers ############## +############################################## +#parse("milemarkers.vm") ##################### ## CALL TO ACTIONS ## ##################### @@ -485,3 +497,4 @@ ${mathUtil.round(${movementInKnots})}KT ## $$ !**NAME/INITIALS**! +#end diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml index a58562feb4..fbceee500e 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/extremeWindWarningFollowup.xml @@ -184,6 +184,11 @@+ distance + + ++ @@ -192,6 +197,11 @@ true 20 10 ++ + ++ warngenlev population diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/fireWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/fireWarning.vm new file mode 100644 index 0000000000..122da993e3 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/fireWarning.vm @@ -0,0 +1,115 @@ +############################################################################### +## FIRE WARNING TEMPLATE ## +## VERSION 1.1 ## +## CREATED BOOKBINDER/DANGELO - 2-07-12 - Initial OB12 Write ## +############################################################################### +${WMOId} ${vtecOffice} 000000 ${BBBId} +FRW${siteId} +${ugcline} + +BULLETIN - EAS ACTIVATION REQUESTED +#if(${productClass}=="T") +TEST...FIRE WARNING...TEST +#else +FIRE WARNING +#end +!** ENTER AUTHORIZING AGENCY HERE **! +RELAYED BY NATIONAL WEATHER SERVICE ${officeShort} +#backupText(${backupSite}) +${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} +## end of addition + +#if(${productClass}=="T") +...THIS MESSAGE IS FOR TEST PURPOSES ONLY... + +#end +THE FOLLOWING MESSAGE IS BEING TRANSMITTED AT THE REQUEST OF !** ENTER AUTHORIZING AGENCY HERE **!. + +############################ +### FIRE WEATHER EMERGENCY # +############################ +#if(${list.contains($bullets, "fireEmergency")}) +THIS IS A FIRE EMERGENCY FOR !** EDIT LOCATION(S) **!...TAKE IMMEDIATE SAFETY PRECAUTIONS NOW. + +#end +#if(${list.contains($bullets, "generic")}) + +!** TYPE FIRE DETAILS HERE **!. + + + +#end + +#if(${list.contains($bullets, "actual")}) + +A FIRE WAS LOCATED !** DETAILS **! AND COULD AFFECT !** AREAS **!. + + + +#end + +#if(${list.contains($bullets, "racing")}) + +A FIRE WAS RACING TOWARD !** LOCATIONS **! AND COULD REACH THERE BY !** TIME **!. + + + +#end + +## parse file command here is to pull in mile marker info +##parse("mileMarkers.vm") + +##################### +## CALL TO ACTIONS ## +##################### +###Check to see if we've selected any calls to action. In our .xml file +##we ended each CTA bullet ID with "CTA" for this reason as a 'trip' +#foreach ($bullet in $bullets) +#if($bullet.endsWith("CTA")) +#set ($ctaSelected = "YES") +#end +#end +## +#if(${ctaSelected} == "YES") +PRECAUTIONARY/PREPAREDNESS ACTIONS... + +#end +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. + +#end +## +#if(${list.contains($bullets, "stayIndoorsCTA")}) + +STAY INDOORS TO KEEP SAFE FROM THE SMOKE. KEEP WINDOWS AND DOORS SHUT AND TURN OFF ALL VENTILATION SYSTEMS. + + + +#end + +#if(${list.contains($bullets, "followInstructionsCTA")}) + +FOLLOW SAFETY INSTRUCTIONS FROM LOCAL LAW ENFORCEMENT OFFICIALS. + + + +#end + +#if(${list.contains($bullets, "heedEvacuationsCTA")}) + +HEED ANY EVACUATION ORDERS AND FOLLOW ALL SAFETY PRECAUTIONS. + + + +#end +#if(${ctaSelected} == "YES") +&& +#end + +#### REMOVE ONE # BELOW FOR LAT/LON OUTPUT +##printcoords(${areaPoly}, ${list}) + +$$ + + +!**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/fireWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/fireWarning.xml new file mode 100644 index 0000000000..6e6ffe3f74 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/fireWarning.xml @@ -0,0 +1,209 @@ + + ++ + + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.vm index 87bf4f397c..487eb2aa26 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.vm @@ -1,13 +1,15 @@ ############################################################ ## FLASH FLOOD WARNING TEMPLATE FOR COUNTY-BASED PRODUCTS ## ############################################################ -## EDITED BY MIKE DANGELO 7-13-2011 ## -## Edited by Phil Kurimski 8-15-2011 for OB11.8.0-4 ## -## EDITED BY EVAN BOOKBINDER 9-15-2011 for OB11.8.0-8 ## -## EDITED BY MIKE DANGELO 9-21-2011 at Alaska TIM ## -## EDITED BY PHIL KURIMSKI 9-23-2011 at Alaska TIM for burn scars and mud slides ## -## EDITED BY EVAN BOOKBINDER 11-04-11 - OB11.9-3 (DRs) ## -## EDITED BY MIKE DANGELO 1-25-2012 at CRH TIM ## +## EDITED BY MIKE DANGELO 7-13-2011 +## Edited by Phil Kurimski 8-15-2011 for OB11.8.0-4 +## EDITED BY EVAN BOOKBINDER 9-15-2011 for OB11.8.0-8 +## EDITED BY MIKE DANGELO 9-21-2011 at Alaska TIM +## EDITED BY PHIL KURIMSKI 9-23-2011 at Alaska TIM for burn scars and mud slides +## EDITED BY EVAN BOOKBINDER 11-04-11 - OB11.9-3 (DRs) +## EDITED BY MIKE DANGELO 1-25-2012 at CRH TIM +## EDITED BY MIKE DANGELO 2-23-2012 +## EDITED BY EVAN BOOKBINDER 2-24-2012 #################################### SET SOME VARIABLES ################################### #set ($hycType = "") @@ -89,11 +91,7 @@ THIS IS A TEST MESSAGE. ## #set ($burnScar = "EXCESSIVE RAINFALL OVER THE BURN SCAR WILL RESULT IN DEBRIS FLOW MOVING THROUGH THE !** DRAINAGE **!. THE DEBRIS FLOW CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") -#else - #set ($burnScar = "") - #set ($burnCTA = "") -#end -#if(${list.contains($bullets, "mudSlide")} ) +#elseif(${list.contains($bullets, "mudSlide")} ) #set ($burnScar = "EXCESSIVE RAINFALL OVER THE WARNING AREA WILL CAUSE MUD SLIDES NEAR STEEP TERRAIN. THE MUD SLIDE CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") @@ -112,86 +110,86 @@ THIS IS A TEST MESSAGE. ## #set ($rainAmount = "UP TO THREE INCHES OF RAIN HAVE ALREADY FALLEN.") #end #if(${list.contains($bullets, "rainEdit")} ) - #set ($rainAmount = "!** RAINFALL AMOUNTS **! INCHES OF RAIN HAVE ALREADY FALLEN.") + #set ($rainAmount = "!** RAINFALL AMOUNTS **! INCHES OF RAIN HAVE FALLEN.") #end #if(${list.contains($bullets, "doppler")}) - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN ACROSS THE WARNED AREA.") #end #if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO THUNDERSTORMS. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR INDICATED THUNDERSTORMS PRODUCING HEAVY RAIN ACROSS THE WARNED AREA.") #end #if(${list.contains($bullets, "dopplerGauge")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA.") #end #if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT A THUNDERSTORM IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT A LINE OF THUNDERSTORMS IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THUNDERSTORMS PRODUCING HEAVY RAIN OVER THE AREA.") #end #if(${list.contains($bullets, "trainedSpotters")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! ${rainAmount} ${isExpected}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "thunder")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED THUNDERSTORMS PRODUCING HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "flash")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED FLASH FLOODING IN !** LOCATION **!. ${rainAmount}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED FLASH FLOODING OCCURRING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **!. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "lawEnforcement")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN OVER !** LOCATION **!. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "thunder")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN DUE TO A THUNDERSTORM OVER !** LOCATION **!. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "flash")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED FLASH FLOODING IN !** LOCATION **!. ${rainAmount}") -#end -#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")}) - #set ($report = "HEAVY RAIN HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **!") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) - #set ($report = "HEAVY RAIN FROM THUNDERSTORMS HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "THE PUBLIC REPORTED HEAVY RAIN FROM THUNDERSTORMS IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "flash")}) - #set ($report = "FLASH FLOODING HAS BEEN REPORTED IN !** LOCATION **!.") + #set ($report = "THE PUBLIC REPORTED FLASH FLOODING OCCURRING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "HEAVY RAIN HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "lawEnforcement")}) + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN OVER !** LOCATION **!.") +#end +#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN DUE THUNDERSTORMS OVER !** LOCATION **!.") +#end +#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "flash")}) + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED FLASH FLOODING IS OCCURRING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN OVER !** LOCATION **! ") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN DUE TO THUNDERSTORMS OVER !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "flash")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED FLASH FLOODING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "satellite")}) - #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN.") #end #if(${list.contains($bullets, "satellite")} && ${list.contains($bullets, "thunder")}) - #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "satellite")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN DUE TO THUNDERSTORMS. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES INDICATED THUNDERSTORMS PRODUCING HEAVY RAIN OVER THE WARNED AREA.") #end #if(${list.contains($bullets, "satelliteGauge")}) - #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE WARNED AREA.") #end #if(${list.contains($bullets, "satelliteGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT A THUNDERSTORM IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "satelliteGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT A LINE OF THUNDERSTORMS IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THUNDERSTORMS WERE PRODUCING HEAVY RAIN OVER THE WARNED AREA.") #end * ## #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end -#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...${report} ${snowMelt} +#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...${report} ${rainAmount} ${isExpected} ${snowMelt} ${burnScar} @@ -206,6 +204,7 @@ ${burnScar} ############################################################# ######## FOURTH BULLET (OPTIONAL IN FLOOD PRODUCTS) ######### ############################################################# +#if(${list.contains($bullets, "listofcities")}) #set ($phenomena = "FLASH FLOOD") #set ($floodType = "FLASH FLOODING") #set ($warningType = "WARNING") @@ -217,8 +216,9 @@ THIS IS A TEST MESSAGE. ## #### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT #### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE #### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! -#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE" ${floodType} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE..." ${floodType} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#end ########################################## END OF OPTIONAL FOURTH BULLET ############################## ###################################### ###### WHERE ADDITIONAL INFO GOES #### @@ -283,7 +283,7 @@ MOST FLOOD DEATHS OCCUR IN AUTOMOBILES. NEVER DRIVE YOUR VEHICLE INTO AREAS WHER #end #if(${list.contains($bullets, "autoSafetyCTA")}) -FLOODING IS OCCURRING OR IS IMMINENT. MOST FLOOD RELATED DEATHS OCCUR IN AUTOMOBILES. DO NOT ATTEMPT TO CROSS WATER COVERED BRIDGES...DIPS... OR LOW WATER CROSSINGS. NEVER TRY TO CROSS A FLOWING STREAM...EVEN A SMALL ONE...ON FOOT. TO ESCAPE RISING WATER FIND ANOTHER ROUTE OVER HIGHER GROUND. +FLOODING IS OCCURRING OR IS IMMINENT. MOST FLOOD RELATED DEATHS OCCUR IN AUTOMOBILES. DO NOT ATTEMPT TO CROSS WATER COVERED BRIDGES...DIPS...OR LOW WATER CROSSINGS. NEVER TRY TO CROSS A FLOWING STREAM...EVEN A SMALL ONE...ON FOOT. TO ESCAPE RISING WATER FIND ANOTHER ROUTE OVER HIGHER GROUND. #end #if(${list.contains($bullets, "camperSafetyCTA")}) @@ -327,19 +327,4 @@ $$ !**NAME/INITIALS**! -########### EXAMPLES OF PARSE OR INCLUDE STATEMENTS ################################ -## the filenames below are tied to a file in the site/XXX/warngen dir (or base as well) -## #parse ("test.vm") -## #include ("username.txt") - -## example of a for-each loop which will include interstate/mile marker information -## Have commented this out (on 9-22-2011) since it is not (yet) working properly - Mike Dangelo -#* -#foreach (${vv} in ${newseward}) -##gid is ${vv.gid}... -##id is ${vv.id}... -name is ${vv.name}... -space -#end -*# diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml index 5170dd69d5..8d51784bf2 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning.xml @@ -4,6 +4,7 @@ Modified by Mike Dangelo 09-22-2011 at Alaska TIM Modified by Phil Kurimski 09-23-2011 for burn scars and mud slides Modified by Mike Dangelo 01-25-2012 at CRH TIM + Modified by Mike Dangelo 02-23-2012 -->mi +mph + + +false + + ++ + + + + ++ + + + ++ + + +true + + +true + + ++ + + +60 ++ + +30 +40 +45 +50 +60 +75 +90 +105 +120 +150 +180 ++ + ++ ++ ++ + + + + + + + + + ++ ++ + + + + + + + + + + +0.00 +AND +0 +COUNTYNAME +NAME +STATE +countyTypes.txt +FIPS ++ +parent ++ ++ ++ 25 ++ + +NAME +POINTS ++ ++ ++ 1 +50 ++ +distance +warngenlev +population ++ + +NAME +POINTS ++ ++ ++ 5 +100 ++ +distance ++ + +true +8.0 +5 +5 +4 +8 +Name +COUNTYNAME +STATE +STATE +countyTypes.txt ++ +distance ++ ++ ++ + + +NAME +TRACK +true +20 +10 ++ ++ ++ + +warngenlev +population ++ + +NAME +TRACK +true +10 +10 ++ +distance ++ ++ ++ + + + + + + +City +County +States +TIMEZONES +TIME_ZONE +@@ -67,28 +68,30 @@ - - - - + + + + + - - - - - - - - - - + + + + + + + + + + + - + @@ -99,10 +102,10 @@ - - + + - + @@ -110,31 +113,33 @@ - + - - - - + + + + + - - - - - - - - - - + + + + + + + + + + + - + @@ -145,10 +150,10 @@ - - + + - + @@ -156,31 +161,33 @@ - + - - - - + + - + + + + - - - - - - - - - - + + + + + + + + + + + - + @@ -191,10 +198,10 @@ - - + + - + @@ -207,12 +214,12 @@ AND 0 COUNTYNAME - +NAME STATE countyTypes.txt FIPS - +NAME + parent @@ -225,6 +232,7 @@25 +true 8.0 @@ -234,12 +242,18 @@8 Name COUNTYNAME +STATE STATE countyTypes.txt + distance + + ++ @@ -248,20 +262,21 @@ +true 30 200 ++ + ++ - warngenlev population - - -- NAME -TRACK +POINTS true 50 10 @@ -269,6 +284,11 @@warngenlev population + + ++ false -- -true -8.0 -5 -5 -4 -8 -Name -COUNTYNAME -STATE -STATE -countyTypes.txt -- -distance -- City County +States TIMEZONES TIME_ZONE + ffmp_basins streamname diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.vm index be6da8cebc..82f0cbd285 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.vm @@ -5,7 +5,9 @@ ## Modified by MIKE DANGELO 9-19-2011 at Alaska TIM ## ## Overhauled by Phil Kurimski 09-23-2011 ## Modified by MIKE DANGELO 1-25-2012 at CRH TIM ## -## +## Modified by MIKE DANGELO 2-23-2012 +## Modified by EVAN BOOKBINDER 2-24-2012 +## Modified by Phil Kurimski 2-29-2012 #################################### SET SOME VARs ################################### #set ($hycType = "") #set ($snowMelt = "") @@ -164,18 +166,14 @@ REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimez #set ($report = "HEAVY RAIN IS OCCURRING. !** ADD MORE DETAIL HERE **!") #if(${list.contains($bullets, "flash")} ) #set ($isExpected = "FLASH FLOODING IS ALREADY OCCURRING.") -#else +#else #set ($isExpected = "FLASH FLOODING IS EXPECTED TO BEGIN SHORTLY.") #end #if(${list.contains($bullets, "burnScar")} ) #set ($burnScar = "EXCESSIVE RAINFALL OVER THE BURN SCAR WILL RESULT IN DEBRIS FLOW MOVING THROUGH THE !** DRAINAGE **!. THE DEBRIS FLOW CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") -#else - #set ($burnScar = "") - #set ($burnCTA = "") -#end -#if(${list.contains($bullets, "mudSlide")} ) +#elseif(${list.contains($bullets, "mudSlide")} ) #set ($burnScar = "EXCESSIVE RAINFALL OVER THE WARNING AREA WILL CAUSE MUD SLIDES NEAR STEEP TERRAIN. THE MUD SLIDE CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") @@ -187,94 +185,98 @@ REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimez #set ($rainAmount = "UP TO ONE INCH OF RAIN HAS ALREADY FALLEN.") #end #if(${list.contains($bullets, "rain2")} ) - #set ($rainAmount = "UP TO TWO INCHES OF RAIN HAS ALREADY FALLEN.") + #set ($rainAmount = "UP TO TWO INCHES OF RAIN HAVE ALREADY FALLEN.") #end #if(${list.contains($bullets, "rain3")} ) - #set ($rainAmount = "UP TO THREE INCHES OF RAIN HAS ALREADY FALLEN.") + #set ($rainAmount = "UP TO THREE INCHES OF RAIN HAVE ALREADY FALLEN.") +#end +#if(${list.contains($bullets, "rainEdit")} ) + #set ($rainAmount = "!** AMOUNT **! INCHES OF RAIN HAVE FALLEN.") #end #if(${list.contains($bullets, "doppler")}) - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN ACROSS THE WARNED AREA.") #end #if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO THUNDERSTORMS. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR INDICATED THUNDERSTORMS PRODUCING HEAVY RAIN ACROSS THE WARNED AREA.") #end #if(${list.contains($bullets, "dopplerGauge")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA.") #end #if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT A THUNDERSTORM IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "dopplerGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THAT A LINE OF THUNDERSTORMS IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR AND AUTOMATED RAIN GAUGES INDICATED THUNDERSTORMS PRODUCING HEAVY RAIN OVER THE WARNED AREA.") #end #if(${list.contains($bullets, "trainedSpotters")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! ${rainAmount} ${isExpected}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "thunder")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **! DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED THUNDERSTORMS PRODUCING HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "flash")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED FLASH FLOODING IN !** LOCATION **!. ${rainAmount}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED FLASH FLOODING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "trainedSpotters")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "lawEnforcement")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN OVER !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN OVER !** LOCATION **!.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "thunder")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN DUE TO A THUNDERSTORM OVER !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN DUE TO A THUNDERSTORM OVER !** LOCATION **!.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "flash")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED FLASH FLOODING IN !** LOCATION **!. ${rainAmount}") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED FLASH FLOODING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN OVER !** LOCATION **! ") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN DUE TO THUNDERSTORMS OVER !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "flash")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED FLASH FLOODING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")}) - #set ($report = "HEAVY RAIN HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "thunder")}) - #set ($report = "HEAVY RAIN FROM THUNDERSTORMS HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "THE PUBLIC REPORTED HEAVY RAIN FROM THUNDERSTORMS IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "flash")}) - #set ($report = "FLASH FLOODING HAS BEEN REPORTED IN !** LOCATION **!.") + #set ($report = "THE PUBLIC REPORTED FLASH FLOODING OCCURRING IN !** LOCATION **!.") #end #if(${list.contains($bullets, "public")} && ${list.contains($bullets, "plainRain")}) - #set ($report = "HEAVY RAIN HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") + #set ($report = "THE PUBLIC REPORTED HEAVY RAIN IN !** LOCATION **!.") #end #if(${list.contains($bullets, "satellite")}) - #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN OVER THE WARNED AREA.") #end #if(${list.contains($bullets, "satellite")} && ${list.contains($bullets, "thunder")}) - #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "satellite")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN DUE TO THUNDERSTORMS. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES INDICATED HEAVY RAIN DUE TO THUNDERSTORMS OVER THE WARNED AREA.") #end #if(${list.contains($bullets, "satelliteGauge")}) - #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT HEAVY RAIN WAS FALLING OVER THE WARNED AREA.") #end #if(${list.contains($bullets, "satelliteGauge")} && ${list.contains($bullets, "thunder")}) - #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT A THUNDERSTORM IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") -#end -#if(${list.contains($bullets, "satelliteGauge")} && ${list.contains($bullets, "thunder")} && ${stormType} == "line") - #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT A LINE OF THUNDERSTORMS IS PRODUCING HEAVY RAIN OVER THE AREA. ${rainAmount} ${isExpected}") + #set ($report = "SATELLITE ESTIMATES AND AUTOMATED RAIN GAUGES INDICATED THAT THUNDERSTORMS WERE PRODUCING HEAVY RAIN OVER THE WARNED AREA.") #end #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end -AT ${dateUtil.format(${now}, ${timeFormat.clock}, ${localtimezone})}...${report} ${snowMelt} +AT ${dateUtil.format(${now}, ${timeFormat.clock}, ${localtimezone})}...${report} ${rainAmount} ${isExpected} ${snowMelt} ${burnScar} ############################################ ######## (CITY LIST) ######### ############################################ +#if(${list.contains($bullets, "listofcities")}) #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end @@ -282,7 +284,9 @@ THIS IS A TEST MESSAGE. ## #### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT #### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE #### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! -#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE" ${floodType} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#locationsList("SOME LOCATIONS THAT WILL EXPERIENCE FLOODING INCLUDE..." ${floodType} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#end ########### KEEP TWO BLANK LINES BELOW @@ -388,6 +392,7 @@ THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. #printcoords(${areaPoly}, ${list}) ########### KEEP TWO BLANK LINES BELOW + #end $$ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml index 1328da1c26..808deac39d 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup.xml @@ -2,7 +2,9 @@ @@ -57,14 +59,14 @@ - + + - @@ -72,26 +74,30 @@ @@ -181,9 +191,9 @@- - - - + + + + - - - - - - - - - - + + + + + + + + + + + + @@ -102,11 +108,11 @@ - - + + - - + + @@ -117,26 +123,30 @@ - - - - + + + + - - - - - - - - - - + + + + + + + + + + + + @@ -147,14 +157,14 @@ - - + + - - + + - + 25 -false +true 8.0 @@ -200,6 +210,11 @@+ distance + + ++ @@ -208,17 +223,18 @@ - + +true 30 200 ++ + ++ - warngenlev population - - -- NAME POINTS @@ -241,7 +257,7 @@ and place into this template -->City -County +County States TIMEZONES diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.vm index 6e08862a83..344d8c3de2 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.vm @@ -4,8 +4,8 @@ ## Modified by MIKE DANGELO 9-19-2011 at Alaska TIM ## ## Overhauled by Phil Kurimski 09-23-2011 to reflect work ## done in August. -## Edited by Mike 01-26-2012 at CRH TIM -## +## Edited by Mike Dangelo 01-26-2012 at CRH TIM +## Edited by Phil Kurimski 2-29-2012 #################################### SET SOME VARs ################################### #set ($hycType = "") #set ($snowMelt = "") @@ -170,11 +170,7 @@ REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimez #set ($burnScar = "EXCESSIVE RAINFALL OVER THE BURN SCAR WILL RESULT IN DEBRIS FLOW MOVING THROUGH THE !** DRAINAGE **!. THE DEBRIS FLOW CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") -#else - #set ($burnScar = "") - #set ($burnCTA = "") -#end -#if(${list.contains($bullets, "mudSlide")} ) +#elseif(${list.contains($bullets, "mudSlide")} ) #set ($burnScar = "EXCESSIVE RAINFALL OVER THE WARNING AREA WILL CAUSE MUD SLIDES NEAR STEEP TERRAIN. THE MUD SLIDE CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") @@ -195,7 +191,7 @@ REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimez #set ($rainAmount = "!** RAINFALL AMOUNTS **! INCHES OF RAIN HAS ALREADY FALLEN.") #end #if(${list.contains($bullets, "doppler")}) - #set ($report = "NATIONAL WEATHER SERVICE DOPPLER RADAR INDICATED HEAVY RAIN. ${rainAmount} ${isExpected}") + #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN. ${rainAmount} ${isExpected}") #end #if(${list.contains($bullets, "doppler")} && ${list.contains($bullets, "thunder")}) #set ($report = "DOPPLER RADAR INDICATED HEAVY RAIN DUE TO A THUNDERSTORM. ${rainAmount} ${isExpected}") @@ -236,6 +232,18 @@ REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimez #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **!. ${rainAmount} ${isExpected}") #end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN OVER !** LOCATION **! ") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN DUE TO THUNDERSTORMS OVER !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "flash")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED FLASH FLOODING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN IN !** LOCATION **!.") +#end #if(${list.contains($bullets, "public")}) #set ($report = "HEAVY RAIN HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") #end diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml index 59653b91d1..d256f5ef36 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarningFollowup_Zones.xml @@ -1,7 +1,8 @@ - +@@ -85,6 +86,7 @@ + @@ -104,7 +106,7 @@ - + @@ -131,6 +133,7 @@ + @@ -150,7 +153,7 @@ - + @@ -195,6 +198,7 @@ false +true 8.0 @@ -211,6 +215,11 @@+ distance + + ++ @@ -219,17 +228,18 @@ true 30 200 ++ + ++ - warngenlev population -- +- -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.vm index aebb3a3cda..f51686c423 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.vm @@ -5,7 +5,7 @@ ## Edited by Phil Kurimski 8-15-2011 for OB11.8 ## ## EDITED BY MIKE DANGELO 9-21-2011 at Alaska TIM ## ## EDITED BY PHIL KURIMSKI 9-23-2011 at Alaska TIM for burn scars and mud slides ## -## +## EDITED BY PHIL KURIMSKI 2-29-2012 #################################### SET SOME VARIABLES ################################### #set ($hycType = "") @@ -88,11 +88,7 @@ THIS IS A TEST MESSAGE. ## #set ($burnScar = "EXCESSIVE RAINFALL OVER THE BURN SCAR WILL RESULT IN DEBRIS FLOW MOVING THROUGH THE !** DRAINAGE **!. THE DEBRIS FLOW CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") -#else - #set ($burnScar = "") - #set ($burnCTA = "") -#end -#if(${list.contains($bullets, "mudSlide")} ) +#elseif(${list.contains($bullets, "mudSlide")} ) #set ($burnScar = "EXCESSIVE RAINFALL OVER THE WARNING AREA WILL CAUSE MUD SLIDES NEAR STEEP TERRAIN. THE MUD SLIDE CAN CONSIST OF ROCK...MUD...VEGETATION AND OTHER LOOSE MATERIALS.") #set ($burnCTA = "PERSONS IN THE VICINITY OF !** DRAINAGE **! SHOULD EVACUATE IMMEDIATELY.") #set ($ctaSelected = "YES") @@ -155,6 +151,18 @@ THIS IS A TEST MESSAGE. ## #if(${list.contains($bullets, "lawEnforcement")} && ${list.contains($bullets, "plainRain")}) #set ($report = "LOCAL LAW ENFORCEMENT REPORTED HEAVY RAIN IN !** LOCATION **!. ${rainAmount} ${isExpected}") #end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN OVER !** LOCATION **! ") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "thunder")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN DUE TO THUNDERSTORMS OVER !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "flash")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED FLASH FLOODING IN !** LOCATION **!.") +#end +#if(${list.contains($bullets, "emergencyManagement")} && ${list.contains($bullets, "plainRain")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED HEAVY RAIN IN !** LOCATION **!.") +#end #if(${list.contains($bullets, "public")}) #set ($report = "HEAVY RAIN HAS BEEN REPORTED IN !** LOCATION **!. ${rainAmount} ${isExpected}") #end @@ -326,19 +334,3 @@ $$ !**NAME/INITIALS**! -########### EXAMPLES OF PARSE OR INCLUDE STATEMENTS ################################ -## the filenames below are tied to a file in the site/XXX/warngen dir (or base as well) -## #parse ("test.vm") -## #include ("username.txt") - -## example of a for-each loop which will include interstate/mile marker information -## Have commented this out (on 9-22-2011) since it is not (yet) working properly - Mike Dangelo -#* -#foreach (${vv} in ${newseward}) -##gid is ${vv.gid}... -##id is ${vv.id}... -name is ${vv.name}... -space -#end -*# - diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml index abbe7a0dad..facef76c93 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/flashFloodWarning_Zones.xml @@ -3,7 +3,8 @@ - +@@ -73,10 +74,12 @@ + - - - + + + + @@ -115,10 +118,12 @@ + - - - + + + + @@ -157,10 +162,12 @@ + - - - + + + + @@ -221,6 +228,7 @@ 25 +true 8.0 @@ -237,6 +245,11 @@+ distance + + ++ @@ -245,17 +258,18 @@ +true 30 200 ++ + ++ - warngenlev population -- +- -- NAME TRACK diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/forecasterName.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/forecasterName.vm new file mode 100644 index 0000000000..a07eb091ca --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/forecasterName.vm @@ -0,0 +1,8 @@ +##$user IS A GLOBAL VARIABLE CONTAINING THE WORKSTATION'S LOGIN USERNAME +#if(${user}=="yourawipslogin") +YOURNAME +#elseif(${user}=="hisawipslogin") +SOMEONEELSESNAME +#else +!**NAME/INITIALS**! +#end \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereThunderstormWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereThunderstormWarning.vm new file mode 100644 index 0000000000..283e35be4b --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereThunderstormWarning.vm @@ -0,0 +1,629 @@ +################################################################ +## SEVERE THUNDERSTORM WARNING TEMPLATE ## +## FOR CR IMPACT BASED SVR INITIATIVE ## +## CREATED BY PHIL KURIMSKI - WFO DTX ## +## VERSION AWIPS II 1.0 -- 2-21-2012 OB12.1.1-1 ## +## VERSION AWIPS II 1.1 -- 2-29-2012 OB12.2.1-4 ## +################################################################ +## +##SET SOME INITIAL VARIABLES +#set ($hazard = "") +#set ($source = "") +#set ($impact = "") +#set ($torTag = "") +#set ($pdssvr = "") +#set ($extrasource = "") +#set ($extraReport = "") +#if(${stormType} == "line") + #set ($report = "A LINE OF SEVERE THUNDERSTORMS WAS REPORTED") + #set($reportType1 = "LINE OF SEVERE THUNDERSTORMS") + #set($reportType2 = "THESE STORMS WERE") + #set($reportType3 = "A LINE OF SEVERE THUNDERSTORMS ARE") +#else + #set ($report = "A SEVERE THUNDERSTORM WAS REPORTED") + #set($reportType1 = "SEVERE THUNDERSTORM") + #set($reportType2 = "THIS STORM WAS") + #set($reportType3 = "A SEVERE THUNDERSTORM IS") +#end +###################################################### +## Check to see if the SVR Tornado Tag was selected ## +###################################################### +#if(${list.contains($bullets, "svrTorTag")}) + #set ($torTag = "TORNADO...POSSIBLE ") +#end +############################################################# +#### CREATE BASIS WORDING ################################### +############################################################# +#if(${list.contains($bullets, "doppler")}) + #set ($report = "DOPPLER RADAR INDICATED A ${reportType1}") + #set($reportAuthSVR = "CAPABLE OF PRODUCING") + #set ($source = "RADAR INDICATED.") +#end +#if(${list.contains($bullets, "trainedSpotters")}) + #set ($report = "TRAINED WEATHER SPOTTERS REPORTED A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "TRAINED WEATHER SPOTTERS.") +#end +#if(${list.contains($bullets, "lawEnforcement")}) + #set ($report = "LAW ENFORCEMENT REPORTED A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "LAW ENFORCEMENT.") +#end +#if(${list.contains($bullets, "emergencyMgmt")}) + #set ($report = "EMERGENCY MANAGEMENT REPORTED A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "EMERGENCY MANAGEMENT.") +#end +#if(${list.contains($bullets, "public")}) + #set ($report = "THE PUBLIC REPORTED A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "PUBLIC.") +#end +################################################### +## HANDLE WIND POSSIBILITIES ###################### +################################################### +#set ($windSpeed = 0) +#set ($windImpact = "") +#set ($extensive = "") +#set ($windTag = "<50MPH") +#if(${list.contains($bullets, "60mphWind")}) + #set ($windThreat = "DAMAGING WINDS IN EXCESS OF 60 MPH") + #set ($windHazard = "60 MPH WIND GUSTS") + #set ($windSpeed = 60) + #set ($windTag = "60MPH") + #set ($windImpact = "LARGE TREE LIMBS BROKEN OFF PARTIALLY BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "70mphWind")}) + #set ($windThreat = "DESTRUCTIVE WINDS IN EXCESS OF 70 MPH") + #set ($windHazard = "70 MPH WIND GUSTS") + #set ($windSpeed = 70) + #set ($windTag = "70MPH") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "80mphWind")}) + #set ($windThreat = "DESTRUCTIVE WINDS IN EXCESS OF 80 MPH") + #set ($windHazard = "80 MPH WIND GUSTS") + #set ($windSpeed = 80) + #set ($windTag = "80MPH") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "90mphWind")}) + #set ($windThreat = "EXTREME DAMAGING WINDS IN EXCESS OF 90 MPH") + #set ($windHazard = "90 MPH WIND GUSTS") + #set ($windSpeed = 90) + #set ($windTag = "90MPH") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact ="TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "100mphWind")}) + #set ($windThreat = "EXTREME DAMAGING WINDS IN EXCESS OF 100 MPH") + #set ($windHazard = "100 MPH WIND GUSTS") + #set ($windSpeed = 100) + #set ($windTag = "100MPH") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact ="TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +################################################### +## HANDLE HAIL POSSIBILITIES ###################### +################################################### +#set ($hailSize = 0) +#set ($smallHail = "") +#set ($hailImpact = "DAMAGE TO ROOFS AND WINDOWS.") +#set ($hailTag = "<.75IN") +#if(${list.contains($bullets, "pennyHail")}) + #set ($hailThreat = "PENNY SIZE") + #set ($hailTrail = " HAIL") + #set ($hailHazard = "PENNY SIZE HAIL") + #set ($hailLead = "") + #set ($hailSize = 0.75) + #set ($hailTag = "0.75IN") +#end +#if(${list.contains($bullets, "nickelHail")}) + #set ($hailThreat = "NICKEL SIZE") + #set ($hailTrail = " HAIL") + #set ($hailHazard = "NICKEL SIZE HAIL") + #set ($hailLead = "") + #set ($hailSize = 0.88) + #set ($hailTag = "0.88IN") +#end +#if(${list.contains($bullets, "quarterHail")}) + #set ($hailThreat = "QUARTER SIZE") + #set ($hailTrail = " HAIL") + #set ($hailHazard = "QUARTER SIZE HAIL") + #set ($hailLead = "") + #set ($hailSize = 1.00) + #set ($hailTag = "1.00IN") +#end +#if(${list.contains($bullets, "halfdollarHail")}) + #set ($hailThreat = "HALF DOLLAR SIZE") + #set ($hailTrail = " HAIL") + #set ($hailHazard = "HALF DOLLAR SIZE HAIL") + #set ($hailLead = "") + #set ($hailSize = 1.25) + #set ($hailTag = "1.25IN") +#end +#if(${list.contains($bullets, "pingpongHail")}) + #set ($hailThreat = "PING PONG BALL SIZE") + #set ($hailLead = "LARGE HAIL UP TO ") + #set ($hailHazard = "PING PONG SIZE HAIL") + #set ($hailTrail = "") + #set ($hailSize = 1.50) + #set ($hailTag = "1.50IN") +#end +#if(${list.contains($bullets, "golfballHail")}) + #set ($hailThreat = "GOLF BALL SIZE") + #set ($hailLead = "LARGE DAMAGING HAIL UP TO ") + #set ($hailHazard = "GOLF BALL SIZE HAIL") + #set ($hailTrail = "") + #set ($hailSize = 1.75) + #set ($hailTag = "1.75IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +#if(${list.contains($bullets, "twoinchHail")}) + #set ($hailThreat = "TWO INCHES IN DIAMETER") + #set ($hailLead = "LARGE DAMAGING HAIL UP TO ") + #set ($hailHazard = "TWO INCH HAIL") + #set ($hailTrail = "") + #set ($hailSize = 2.00) + #set ($hailTag = "2.00IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +#if(${list.contains($bullets, "tennisBallHail")}) + #set ($hailThreat = "TENNIS BALL SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailHazard = "TENNIS BALL SIZE HAIL") + #set ($hailSize = 2.50) + #set ($hailTag = "2.50IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +#if(${list.contains($bullets, "baseballHail")}) + #set ($hailThreat = "BASEBALL SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailHazard = "BASEBALL SIZE HAIL") + #set ($hailTrail = "") + #set ($hailSize = 2.75) + #set ($hailTag = "2.75IN") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +#if(${list.contains($bullets, "threeinchHail")}) + #set ($hailThreat = "THREE INCHES IN DIAMETER") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailHazard = "THREE INCH HAIL") + #set ($hailTrail = "") + #set ($hailSize = 3.00) + #set ($hailTag = "3.00IN") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +#if(${list.contains($bullets, "grapefruitHail")}) + #set ($hailThreat = "GRAPEFRUIT SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailHazard = "GRAPEFRUIT SIZE HAIL") + #set ($hailTrail = "") + #set ($hailSize = 4.00) + #set ($hailTag = "4.00IN") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +#if(${list.contains($bullets, "softballHail")}) + #set ($hailThreat = "SOFTBALL SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailHazard = "SOFTBALL SIZE HAIL") + #set ($hailTrail = "") + #set ($hailSize = 4.25) + #set ($hailTag = "4.25IN") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") +#end +################################################################### +### CHANGE MND EAS INSTRUCTIONS FOR REALLY SEVERE STORMS ########## +################################################################### +#if (${hailSize} >=2 || ${windSpeed} >= 80) + #set ($easActivation = "EAS ACTIVATION REQUESTED") +#else + #set ($easActivation = "IMMEDIATE BROADCAST REQUESTED") +#end +################################################################## +######### CREATE A WIND AND HAIL SENTENCE ######################## +################################################################## +#if (${hailSize} < 1 && ${windSpeed} < 58) + #set ($hailwind = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") + #set ($windhailTag = "WIND...HAIL <50MPH <.75IN") + #set ($impact = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") + #set ($hazard = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") +#elseif(${hailSize} > 0 && ${windSpeed} > 0) + #if (${hailSize} < 1) + #set ($hailwind = " ${reportAuthSVR} ${windThreat}") + #set ($smallHail = "${hailThreat}${hailTrail} MAY ALSO ACCOMPANY THE DAMAGING WINDS.") + #set ($impact = "${extensive}${hailImpact} ${windImpact}") + #set ($hazard = "${windHazard} AND ${hailHazard}.") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${windHazard}...${hailHazard} AND POSSIBLE TORNADO.") + #end + #else + #set ($hailwind = " ${reportAuthSVR} ${hailLead}${hailThreat}${hailTrail} AND ${windThreat}") + #set ($impact = "${extensive}${hailImpact} ${windImpact}") + #set ($hazard = "${hailHazard} AND ${windHazard}.") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${hailHazard}...${windHazard} AND POSSIBLE TORNADO.") + #end + #end + #set ($windhailTag = "WIND...HAIL ${windTag} ${hailTag}") +#elseif(${hailSize} > 0) + #set ($hailwind = " ${reportAuthSVR} ${hailLead}${hailThreat}${hailTrail}") + #set ($windhailTag = "WIND...HAIL <50MPH ${hailTag}") + #set ($impact = "${extensive}${hailImpact}") + #set ($hazard = "${hailHazard}.") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${hailHazard} AND POSSIBLE TORNADO.") + #end +#elseif(${windSpeed} > 0) + #set ($hailwind = " ${reportAuthSVR} ${windThreat}") + #set ($windhailTag = "WIND...HAIL ${windTag} <.75IN") + #set ($impact = "${extensive}${hailImpact} ${windImpact}") + #set ($hazard = "${windHazard}.") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${windHazard} AND POSSIBLE TORNADO.") + #end +#end +################################################################ +######### ~*~*~*~*~*~* BEGIN OUTPUT ~*~*~*~*~*~*~ ############## +################################################################ +${WMOId} ${vtecOffice} 000000 ${BBBId} +SVR${siteId} +${ugcline} +/${productClass}.${action}.${vtecOffice}.SV.W.${etn}.${dateUtil.format(${start}, ${timeFormat.ymdthmz})}-${dateUtil.format(${expire}, ${timeFormat.ymdthmz}, 15)}/ + +BULLETIN - ${easActivation} +#if(${productClass}=="T") +TEST...SEVERE THUNDERSTORM WARNING...TEST +#else +SEVERE THUNDERSTORM WARNING +#end +NATIONAL WEATHER SERVICE ${officeShort} +#backupText(${backupSite}) +${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} + +#if(${productClass}=="T") +...THIS MESSAGE IS FOR TEST PURPOSES ONLY... + +#end +#headline(${officeLoc}, ${backupSite}) + +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +SEVERE THUNDERSTORM WARNING FOR... +#firstBullet(${areas}) + +#################################################### +############# SECOND BULLET ######################## +#################################################### +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#secondBullet(${dateUtil},${expire},${timeFormat},${localtimezone},${secondtimezone}) + +#################################################### +############# THIRD BULLET ######################### +#################################################### +###################################################### +###### Add damage information to the source section +###### If Additional Information is selected +###################################################### +############################################# +######## GENERATE ADDITIONAL REPORTS ####### +############################################# +#if(${list.contains($bullets, "addlHailRpt")}) + #set ($extraReport = "IN ADDITION...AT !**enter time, hail**! WAS REPORTED !**enter location**!.") + #set ($extrasource = " !**enter type of damage**! WAS REPORTED !**enter location**!. ") +#elseif(${list.contains($bullets, "addlWindRpt")}) + #set ($extraReport = "IN ADDITION...AT !**enter time, wind**! WAS REPORTED !**enter location**!.") + #set ($extrasource = " !**enter type of damage**! WAS REPORTED !**enter location**!. ") +#elseif(${list.contains($bullets, "addlHailWindRpt")}) + #set ($extraReport = "IN ADDITION...AT !**enter time, hail and wind**! WAS REPORTED !**enter location**!.") + #set ($extrasource = " !**enter type of damage**! WAS REPORTED !**enter location**!. ") +#end + +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone}) +...${reportType3} ## +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES", false) +#if($movementSpeed < 3 || ${stationary}) +#if(${stormType} == "line") +...AND ARE NEARLY STATIONARY. + #else +...AND IS NEARLY STATIONARY. + #end +#else +...MOVING #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. +#end +#* +#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone}) +...${report}${hailwind}. ${reportType2} LOCATED ## +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES", false) +#if($movementSpeed < 3 || ${stationary}) +. ${reportType2} NEARLY STATIONARY. ${smallHail} +#else +...AND MOVING #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. ${smallHail} +#end +*# + +########################################################################## +## Section to include the dangerous storm wording as well as the hazard ## +########################################################################## +${pdssvr} + +HAZARD...${hazard} + +SOURCE...${source}${extrasource} + +IMPACT...${impact} + +## + +${extraReport} + +################################################### +######## GENERATE PATHCAST OR CITIES LIST ######### +################################################### +#if(${stormType} == "line") +#set ($pathcastLead = "SEVERE THUNDERSTORMS") +#set ($otherLead = "THESE SEVERE THUNDERSTORMS") +#else +#set ($pathcastLead = "THIS SEVERE THUNDERSTORM") +#set ($otherLead = "THIS SEVERE THUNDERSTORM") +#end +#if(${list.contains($bullets, "pathcast")}) +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#pathCast("${pathcastLead} WILL BE NEAR..." ${otherLead} ${pathCast} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#elseif(${list.contains($bullets, "listofcities")}) +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#### THE THIRD ARGUMENT IS A NUMBER SPECIFYING THE NUMBER OF COLUMNS TO OUTPUT THE CITIES LIST IN +#### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT +#### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE +#### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! +#locationsList("LOCATIONS IMPACTED INCLUDE..." ${otherLead} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#else +* LOCATIONS IMPACTED INCLUDE... + !** YOU DID NOT SELECT A PATHCAST OR LIST OF CITIES BULLET. PLEASE ENTER LOCATIONS IMPACTED **!. + +#end +############################################## +###### SPECIAL VENUE/EVENT CASE ############## +############################################## +#if(${list.contains($bullets, "specialEvent")}) +#if(${stormType} == "line") +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF THESE STORMS AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. + +#else +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF THIS STORM AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. + +#end +#end + +## parse file command here is to pull in mile marker info +## #parse("mileMarkers.vm") + +################################## +######### CALLS TO ACTION ######## +################################## +##Check to see if we've selected any calls to action. In our .cfg file +##we ended each CTA bullet ID with "CTA" for this reason as a 'trip' +#foreach ($bullet in $bullets) +#if($bullet.endsWith("CTA")) +#set ($ctaSelected = "YES") +#end +#end +## +#if(${ctaSelected} == "YES") +PRECAUTIONARY/PREPAREDNESS ACTIONS... + +#end +## +#if(${list.contains($bullets, "torWatchRemainsInEffectCTA")}) +REMAIN ALERT FOR A POSSIBLE TORNADO! TORNADOES CAN DEVELOP QUICKLY FROM SEVERE THUNDERSTORMS. IF YOU SPOT A TORNADO GO AT ONCE INTO THE BASEMENT OR SMALL CENTRAL ROOM IN A STURDY STRUCTURE. + +#end +## +#if(${list.contains($bullets, "genericCTA")}) +FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. + +#end +## +#if(${list.contains($bullets, "canProduceTornadoesCTA")}) +UNDER CURRENT CONDITIONS TORNADO DEVELOPMENT IS NOT LIKELY...BUT TORNADOES CAN DEVELOP QUICKLY FROM SEVERE THUNDERSTORMS. ALTHOUGH ONE IS NOT IMMEDIATELY LIKELY...IF A TORNADO IS SPOTTED...ACT QUICKLY AND MOVE TO A PLACE OF SAFETY IN A STURDY STRUCTURE...SUCH AS A BASEMENT OR SMALL INTERIOR ROOM. + +#end +## +#if(${list.contains($bullets, "largeHailCTA")}) +PREPARE IMMEDIATELY FOR LARGE HAIL AND DEADLY CLOUD TO GROUND LIGHTNING. PEOPLE OUTSIDE SHOULD MOVE TO A SHELTER...INSIDE A STRONG BUILDING AND AWAY FROM WINDOWS. + +#end +## +#if(${list.contains($bullets, "veryLargeHailCTA")}) +PREPARE IMMEDIATELY FOR LARGE DESTRUCTIVE HAIL CAPABLE OF PRODUCING SIGNIFICANT DAMAGE. PEOPLE OUTSIDE SHOULD MOVE TO A SHELTER...INSIDE A STRONG BUILDING AND AWAY FROM WINDOWS. + +#end +## +#if(${list.contains($bullets, "largeHailWindCTA")}) +PREPARE IMMEDIATELY FOR LARGE HAIL AND DAMAGING WINDS. PEOPLE OUTSIDE SHOULD MOVE TO A SHELTER...INSIDE A STRONG BUILDING AND AWAY FROM WINDOWS. + +#end +## +#if(${list.contains($bullets, "historyHailCTA")}) +#if(${stormType} == "line") +THESE STORMS ARE PRODUCING LARGE HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +THIS STORM IS PRODUCING LARGE HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "historyWindCTA")}) +#if(${stormType} == "line") +THIS IS A VERY DANGEROUS SITUATION. THESE STORMS ARE PRODUCING WIDESPREAD WIND DAMAGE ACROSS !** ENTER LOCATION **!. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +THIS IS A VERY DANGEROUS SITUATION. THIS STORM IS PRODUCING WIDESPREAD WIND DAMAGE ACROSS !** ENTER LOCATION **!. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "historyWindHailCTA")}) +#if(${stormType} == "line") +THIS IS A VERY DANGEROUS SITUATION. THESE STORMS ARE PRODUCING DESTRUCTIVE WINDS AND LARGE DAMAGING HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +THIS IS A VERY DANGEROUS SITUATION. THIS STORM IS PRODUCING DESTRUCTIVE WINDS AND LARGE DAMAGING HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "lawEnforcementCTA")}) +TO REPORT SEVERE WEATHER CONTACT YOUR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL SEND YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE IN ${officeLoc}. + +#end +## +#if(${list.contains($bullets, "squallLineCTA")}) +#if(${stormType} == "line") +INTENSE SQUALL LINES CAN SOMETIMES PRODUCE BRIEF TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. ALTHOUGH NOT IMMEDIATELY LIKELY...IT IS BEST TO MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THESE STORMS MAY CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#else +INTENSE SQUALL LINES CAN SOMETIMES PRODUCE BRIEF TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. ALTHOUGH NOT IMMEDIATELY LIKELY...IT IS BEST TO MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THIS STORM MAY CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#end +#end +## +#if(${list.contains($bullets, "superCellsCTA")}) +THIS IS A SUPERCELL THUNDERSTORM. THEY ARE CAPABLE OF PRODUCING ALL TYPES OF SEVERE WEATHER...INCLUDING EXTREMELY LARGE HAIL...DESTRUCTIVE STRAIGHT LINE WINDS...AND TORNADOES. MOVE QUICKLY TO A SAFE SHELTER...SUCH AS AN INTERIOR ROOM...A BATHROOM OR CLOSET OR BASEMENT. + +#end +## +#if(${list.contains($bullets, "gustFrontOutflowCTA")}) +#if(${stormType} == "line") +WIND DAMAGE WITH THESE STORMS WILL OCCUR BEFORE ANY RAIN OR LIGHTNING. DO NOT WAIT FOR THE SOUND OF THUNDER BEFORE TAKING COVER. SEEK SHELTER IMMEDIATELY INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +WIND DAMAGE WITH THIS STORM WILL OCCUR BEFORE ANY RAIN OR LIGHTNING. DO NOT WAIT FOR THE SOUND OF THUNDER BEFORE TAKING COVER. SEEK SHELTER IMMEDIATELY INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "extremeWindsCTA")}) +#if(${stormType} == "line") +THIS IS AN EXTREMELY DANGEROUS SITUATION WITH TORNADO LIKE WIND SPEEDS EXPECTED. MOBILE HOMES AND HIGH PROFILE VEHICLES ARE ESPECIALLY SUSCEPTIBLE TO WINDS OF THIS MAGNITUDE AND MAY BE OVERTURNED. FOR YOUR PROTECTION MOVE IMMEDIATELY TO A SAFE SHELTER OR TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THESE STORMS HAVE THE POTENTIAL TO CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#else +THIS IS AN EXTREMELY DANGEROUS SITUATION WITH TORNADO LIKE WIND SPEEDS EXPECTED. MOBILE HOMES AND HIGH PROFILE VEHICLES ARE ESPECIALLY SUSCEPTIBLE TO WINDS OF THIS MAGNITUDE AND MAY BE OVERTURNED. FOR YOUR PROTECTION MOVE IMMEDIATELY TO A SAFE SHELTER OR TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THIS STORM HAS THE POTENTIAL TO CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#end +#end +## +#if(${list.contains($bullets, "lightningCTA")}) +#if(${stormType} == "line") +LARGE HAIL AND DAMAGING WINDS AND CONTINUOUS CLOUD TO GROUND LIGHTNING IS OCCURRING WITH THESE STORMS. MOVE INDOORS IMMEDIATELY. LIGHTNING IS ONE OF NATURES LEADING KILLERS. REMEMBER...IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. + +#else +LARGE HAIL AND DAMAGING WINDS AND CONTINUOUS CLOUD TO GROUND LIGHTNING IS OCCURRING WITH THIS STORM. MOVE INDOORS IMMEDIATELY. LIGHTNING IS ONE OF NATURES LEADING KILLERS. REMEMBER...IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. + +#end +#end +## +#if(${list.contains($bullets, "boatersCTA")}) +IF ON OR NEAR !**Name Of Lake**!...GET AWAY FROM THE WATER AND MOVE INDOORS OR INSIDE A VEHICLE. REMEMBER...LIGHTNING CAN STRIKE OUT TO 15 MILES FROM THE PARENT THUNDERSTORM. IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. MOVE TO SAFE SHELTER NOW. DO NOT BE CAUGHT ON THE WATER IN A THUNDERSTORM. + +#end +## +#if(${list.contains($bullets, "torrentialRainfallCTA")}) +#if(${stormType} == "line") +TORRENTIAL RAINFALL IS OCCURRING WITH THESE STORMS...AND MAY LEAD TO FLASH FLOODING. DO NOT DRIVE YOUR VEHICLE THROUGH FLOODED ROADWAYS. + +#else +TORRENTIAL RAINFALL IS OCCURRING WITH THIS STORM...AND MAY LEAD TO FLASH FLOODING. DO NOT DRIVE YOUR VEHICLE THROUGH FLOODED ROADWAYS. + +#end +#end +## +#if(${ctaSelected} == "YES") +&& + +#end +## +############# +## WATCHES ## +############# + +#if(${list.contains($includedWatches, "torWatches")}) +#inserttorwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat}) + +#end +#* NO NEED TO INCLUDE SVR T-STM WATCHES IN A SVR WARNING!!!! +#if(${list.contains($includedWatches, "svrWatches")}) +#insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat}) +# +#end +*# +## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. + +#end +#printcoords(${areaPoly}, ${list}) + +TIME...MOT...LOC ## +${dateUtil.format(${event}, ${timeFormat.time})}Z ## +${mathUtil.round(${movementDirection})}DEG ## +${mathUtil.round(${movementInKnots})}KT ## +#foreach(${eventCoord} in ${eventLocation}) +#llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## +#end +## UNCOMMENT 2 LINES BELOW IF PARTICIPATING IN THE WIND/HAIL TAG EXPERIMENT +## +##${windhailTag} + +########################################################### +## CODE FOR TORNADO/HAIL/WIND TAGS USED BY CR +## FOR THE IMPACT BASED SEVERE WEATHER TEMPLATE EXPERIMENT +## THE TORNADO TAGS WILL ONLY BE USED FOR CERTAIN WIND/HAIL/CTA SELECTIONS ABOVE +########################################################### + +${torTag} +HAIL...${hailTag} +WIND...${windTag} + +$$ + +############################################## +## Code to pull the user name into the product +############################################## +##${user} +################################################################## +## If you decide to pull the user name from a file use this coding +################################################################## +##parse("name.vm") +!**NAME/INITIALS**! \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereThunderstormWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereThunderstormWarning.xml new file mode 100644 index 0000000000..d04fcfdef0 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereThunderstormWarning.xml @@ -0,0 +1,327 @@ + + ++ + + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereWeatherStatement.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereWeatherStatement.vm new file mode 100644 index 0000000000..569217dd5a --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereWeatherStatement.vm @@ -0,0 +1,1117 @@ +################################################################ +## SEVERE WEATHER STATEMENT TEMPLATE ## +## FOR CR IMPACT BASED TOR/SVR INITIATIVE ## +## CREATED BY PHIL KURIMSKI - WFO DTX ## +## VERSION AWIPS II 1.0 -- 2-21-2012 OB12.1.1-1 ## +## VERSION AWIPS II 1.1 -- 2-29-2012 OB12.2.1-4 ## +################################################################ +## +################################################################### +## Set null variables for wind/hail tags used in the template ## +################################################################### +#set ($windhailTag = "") +#set ($hailTag = "") +#set ($windTag = "") +#set ($hazard = "") +#set ($source = "") +#set ($impact = "") +#set ($torTag = "") +#set ($svrTorTag = "") +#set ($pdssvr = "") +#set ($pdstor = "") +#set ($extrasource = "") +#set ($torimpact = "") +#set ($svrimpact = "") +#set ($confirmed = "") +############################################ +## CREATE INITIAL SET OF VARIABLES ## +############################################ +##PATHCAST LEAD VARIABLE ADD LATER????? +#if(${phenomena}=="SV") + #set($eventType = "SEVERE THUNDERSTORM") + #if(${stormType} == "line") + #set($reportType1 = "LINE OF SEVERE THUNDERSTORMS") + #set($reportType2 = "THESE STORMS WERE") + #set($reportType = "A LINE OF SEVERE THUNDERSTORMS ARE") + #set($pathcastLead = "THESE SEVERE STORMS") + #else + #set($reportType1 = "SEVERE THUNDERSTORM") + #set($reportType2 = "THIS STORM WAS") + #set($reportType = "A SEVERE THUNDERSTORM IS") + #set($pathcastLead = "THIS SEVERE STORM") + #end +#elseif(${phenomena}=="TO") + #set($eventType = "TORNADO") + #set ($torTag = "RADAR INDICATED") + #set ($torThreat = "") + #set ($torHazard = "POTENTIAL TORNADO") + #set ($source = "RADAR INDICATED ROTATION.") + #set ($torimpact = "EXTENSIVE DAMAGE TO ROOFS AND WINDOWS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A TORNADO WAS REPORTED") + #set($reportType1 = "LINE OF TORNADO PRODUCING STORMS") + #set($reportType2 = "THESE TORNADO PRODUCING STORMS WERE") + #set($pathcastLead = "THESE TORNADIC STORMS") + #else + #set($reportType = "A LINE OF TORNADO PRODUCING STORMS WAS REPORTED") + #set($reportType1 = "TORNADO") + #set($reportType2 = "THIS TORNADIC STORM WAS") + #set($pathcastLead = "THIS TORNADO") + #end +#end +###################################################### +## Check to see if the SVR Tornado Tag was selected ## +###################################################### +#if(${list.contains($bullets, "svrTorTag")}) + #set ($svrTorTag = "mi +mph + + ++ + + + + ++ + + +NEW +COR ++ + + +SV.W +true + + +true + + ++ + + +torWatches +30 ++ + + +15 +20 +25 +30 +40 +45 +50 +60 +75 +90 ++ + + + + + + + ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.00 +AND +0 +COUNTYNAME + +NAME +STATE +countyTypes.txt +FIPS + +NAME ++ +name ++ ++ ++ 25 ++ + +NAME +POINTS ++ ++ ++ 1 +50 ++ +distance +warngenlev +population ++ + +NAME +POINTS ++ ++ ++ 5 +100 ++ +distance ++ + +true +8.0 +5 +5 +10 +8 +Name +COUNTYNAME + +STATE +STATE +countyTypes.txt ++ +population ++ ++ ++ + + +NAME +TRACK +true +20 +10 ++ ++ ++ + +warngenlev +population ++ + + +NAME +TRACK +true +10 +10 ++ +distance ++ ++ ++ + + + +City +County + +States +TIMEZONES +TIME_ZONE +TORNADO...POSSIBLE ") +#end +###################################### +### CREATE WMO/MND HEADER ############ +###################################### +${WMOId} ${vtecOffice} 000000 ${BBBId} +SVS${siteId} +#if(${productClass}=="T") +TEST...SEVERE WEATHER STATEMENT...TEST +#else +SEVERE WEATHER STATEMENT +#end +NATIONAL WEATHER SERVICE ${officeShort} +#backupText(${backupSite}) +${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} + +#if(${action}=="CANCON") +${ugclinecan} +/${productClass}.CAN.${vtecOffice}.${phenomena}.W.${etn}.000000T0000Z-${dateUtil.format(${expire},${timeFormat.ymdthmz})}/ +#foreach (${area} in ${cancelareas}) +${area.name} ${area.stateabbr}-## +#end +#else +${ugcline} +/${productClass}.${action}.${vtecOffice}.${phenomena}.W.${etn}.000000T0000Z-${dateUtil.format(${expire},${timeFormat.ymdthmz})}/ +#foreach (${area} in ${areas}) +${area.name} ${area.stateabbr}-## +#end +#end + +${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} + +#if(${productClass}=="T") +...THIS MESSAGE IS FOR TEST PURPOSES ONLY... + +#end +####################################### +###### END CREATE HEADER ############## +####################################### +## +## +################################################################# +################################################################# +## LETS START WITH EXPIRATION AND CANCELLATION SEGMENTS ##### +################################################################# +################################################################# +### CREATE PHRASING DEPENDING ON WHETHER WE ISSUE EXP PRIOR TO EXPIRATION TIME OR NOT +#if(${now.compareTo(${expire})} >= 0 && ${action}=="EXP" ) + #set($expcanHLTag = "HAS EXPIRED") + #set($expcanBODYTag = "HAS BEEN ALLOWED TO EXPIRE") +#elseif(${action}=="EXP") + #set($expcanHLTag = "WILL EXPIRE AT ${dateUtil.format(${expire}, ${timeFormat.clock}, 15, ${localtimezone})}") + #set($expcanBODYTag = "WILL BE ALLOWED TO EXPIRE") +#elseif(${action}=="CAN" || ${action}=="CANCON") + #set($expcanHLTag = "IS CANCELLED") + #set($expcanBODYTag = "HAS BEEN CANCELLED") +#end +################################ +#### CREATE HEADLINES ########## +################################ +## +#if(${action}=="EXP" || ${action}=="CAN") +...THE ${eventType} WARNING FOR ## +#headlineLocList(${areas} true true true false) + ${expcanHLTag}... +## SLIGHTLY DIFFERENT VARIABLE FOR PARTIAL CANCELLATION HEADLINE +#elseif(${action}=="CANCON") +...THE ${eventType} WARNING FOR ## +#headlineLocList(${cancelareas} true true true false) + ${expcanHLTag}... +#end +############################ +## END CAN/EXP HEADLINE #### +############################ +## +######################################### +## NOW LETS FORGE OUR CAN/EXP STATEMENTS# +######################################### +#if(${action}=="EXP" || ${action}=="CAN" || ${action}=="CANCON") +#### SET A DEFAULT STATEMENT IN CASE NO BULLET WAS SELECTED OR AVAILABLE +#if(${stormType} == "line") + #set($expcanPhrase = "THE LINE OF STORMS WHICH PROMPTED THE WARNING HAVE !** WEAKENED/MOVED OUT OF THE WARNED AREA **!. THEREFORE THE WARNING ${expcanBODYTag}.") +#else + #if(${phenomena}=="SV") + #set($expcanPhrase = "THE SEVERE THUNDERSTORM WHICH PROMPTED THE WARNING HAS !** WEAKENED/MOVED OUT OF THE WARNED AREA **!. THEREFORE THE WARNING ${expcanBODYTag}.") + #else + #set($expcanPhrase = "THE TORNADIC THUNDERSTORM WHICH PROMPTED THE WARNING HAS !** WEAKENED/MOVED OUT OF THE WARNED AREA **!. THEREFORE THE WARNING ${expcanBODYTag}.") + #end +#end +#### WEAKENED BELOW SEVERE LIMITS +#if(${list.contains($bullets, "weakened")}) + #if(${stormType} == "line") + #if(${phenomena}=="SV") + #set($expcanPhrase = "THE LINE OF STORMS WHICH PROMPTED THE WARNING HAVE WEAKENED BELOW SEVERE LIMITS...AND NO LONGER POSE AN IMMEDIATE THREAT TO LIFE OR PROPERTY. THEREFORE THE WARNING ${expcanBODYTag}.") + #else + #set($expcanPhrase = "THE LINE OF STORMS WHICH PROMPTED THE WARNING HAVE WEAKENED BELOW SEVERE LIMITS...AND NO LONGER APPEAR CAPABLE OF PRODUCING A TORNADO. THEREFORE THE WARNING ${expcanBODYTag}.") + #end + #else + #if(${phenomena}=="SV") + #set($expcanPhrase = "THE STORM WHICH PROMPTED THE WARNING HAS WEAKENED BELOW SEVERE LIMITS...AND NO LONGER POSE AN IMMEDIATE THREAT TO LIFE OR PROPERTY. THEREFORE THE WARNING ${expcanBODYTag}.") + #else + #set($expcanPhrase = "THE STORM WHICH PROMPTED THE WARNING HAS WEAKENED BELOW SEVERE LIMITS...AND NO LONGER APPEARS CAPABLE OF PRODUCING A TORNADO. THEREFORE THE WARNING ${expcanBODYTag}.") + #end + #end +#end +#### MOVED OUT OF THE WARNED AREA +#if(${list.contains($bullets, "movedout")}) + #if(${stormType} == "line") + #set($expcanPhrase = "THE LINE OF STORMS WHICH PROMPTED THE WARNING HAVE MOVED OUT OF THE AREA. THEREFORE THE WARNING ${expcanBODYTag}.") + #else + #set($expcanPhrase = "THE STORM WHICH PROMPTED THE WARNING HAS MOVED OUT OF THE AREA. THEREFORE THE WARNING ${expcanBODYTag}.") + #end +#end +#### WEAKENED AND MOVED OUT OF THE AREA +#if(${list.contains($bullets, "wkndandmoved")}) + #if(${stormType} == "line") + #set($expcanPhrase = "THE LINE OF STORMS WHICH PROMPTED THE WARNING HAVE WEAKENED BELOW SEVERE LIMITS...AND EXITED THE WARNED AREA. THEREFORE THE WARNING ${expcanBODYTag}.") + #else + #set($expcanPhrase = "THE STORM WHICH PROMPTED THE WARNING HAS WEAKENED BELOW SEVERE LIMITS AND EXITED THE WARNED AREA. THEREFORE THE WARNING ${expcanBODYTag}.") + #end +#end +#### SVR UPGRADED TO TOR +#if(${list.contains($bullets, "torupgrade")}) + #set($expcanPhrase = "THE SEVERE THUNDERSTORM WARNING THAT WAS PREVIOUSLY IN EFFECT HAS BEEN UPGRADED TO A TORNADO WARNING. PLEASE REFER TO THAT BULLETIN FOR THE LATEST INFORMATION ON THIS DANGEROUS WEATHER SITUATION.") +#end +#### SVR REISSUE +#if(${list.contains($bullets, "svrreissue")}) + #set($expcanPhrase = "THE SEVERE THUNDERSTORM WARNING THAT WAS PREVIOUSLY IN EFFECT HAS BEEN REISSUED FOR !** INSERT COUNTY(IES)**! AND IS IN EFFECT UNTIL !**NEW WARNING TIME**!. PLEASE REFER TO THAT BULLETIN FOR THE LATEST SEVERE WEATHER INFORMATION.") +#end +#### TORNADO WARNING CANCEL -- SEVERE STILL IN EFFECT +#if(${list.contains($bullets, "tordowngrade")}) + #set($expcanPhrase = "THE TORNADO THREAT HAS DIMINISHED...THEREFORE THE TORNADO WARNING HAS BEEN CANCELLED. HOWEVER...LARGE HAIL AND DAMAGING WINDS REMAIN LIKELY AND A SEVERE THUNDERSTORM WARNING REMAINS IN EFFECT FOR THE AREA.") +#end +#### TORNADO WARNING EXPIRED - REISSUE +#if(${list.contains($bullets, "torreissue")}) + #set($expcanPhrase = "THE TORNADO WARNING THAT WAS PREVIOUSLY IN EFFECT HAS BEEN REISSUED FOR !** INSERT COUNTY(IES)**! AND IS IN EFFECT UNTIL !**NEW WARNING TIME**!. PLEASE REFER TO THAT BULLETIN FOR THE LATEST SEVERE WEATHER INFORMATION.") +#end +######################################## +## END OF WARNING THREATS SECTION ###### +######################################## +### SET INITIAL VARIABLES #### +#if(${stormType} == "line") + #set($stormTypePhrase = "THESE THUNDERSTORMS") +#else + #set($stormTypePhrase = "THIS THUNDERSTORM") +#end +#set($addhailcheck = 0) +#set($addwindcheck = 0) +#set($addraincheck = 0) +#set($watchlead = "ADDITIONAL SEVERE THUNDERSTORM DEVELOPMENT REMAINS POSSIBLE") +##Hail still a threat +#if(${list.contains($bullets, "stillhail")}) + #set($addhail = "SMALL HAIL") + #set($addhailcheck = 1) + #set($watchlead = "IN ADDITION...SEVERE THUNDERSTORM REDEVELOPMENT REMAINS POSSIBLE") +#end +##Wind still a threat +#if(${list.contains($bullets, "stillwind")}) + #set($addwind = "GUSTY WINDS") + #set($addwindcheck = 1) + #set($watchlead = "IN ADDITION...SEVERE THUNDERSTORM REDEVELOPMENT REMAINS POSSIBLE") +#end +##Hvy rain still a threat +#if(${list.contains($bullets, "stillrain")}) + #set($addrain = "HEAVY RAIN") + #set($addraincheck = 1) + #set($watchlead = "IN ADDITION...SEVERE THUNDERSTORM REDEVELOPMENT REMAINS POSSIBLE") +#end +## FORMULATE PHRASEOLOGY +#set($addthreat = "") +#if(${addhailcheck} == "1" && ${addwindcheck} == "0" && ${addraincheck} == "0" ) + #set($addthreat = " HOWEVER ${addhail} IS STILL POSSIBLE WITH ${stormTypePhrase}.") +#elseif (${addhailcheck} == "0" && ${addwindcheck} == "1" && ${addraincheck} == "0" ) + #set($addthreat = " HOWEVER ${addwind} ARE STILL POSSIBLE WITH ${stormTypePhrase}.") +#elseif (${addhailcheck} == "0" && ${addwindcheck} == "0" && ${addraincheck} == "1" ) + #set($addthreat = " HOWEVER ${addrain} IS STILL POSSIBLE WITH ${stormTypePhrase}.") +#elseif (${addhailcheck} == "1" && ${addwindcheck} == "1" && ${addraincheck} == "0" ) + #set($addthreat = " HOWEVER ${addhail} AND ${addwind} ARE STILL POSSIBLE WITH ${stormTypePhrase}.") +#elseif (${addhailcheck} == "1" && ${addwindcheck} == "0" && ${addraincheck} == "1" ) + #set($addthreat = " HOWEVER ${addhail} AND ${addrain} ARE STILL POSSIBLE WITH ${stormTypePhrase}.") +#elseif (${addhailcheck} == "0" && ${addwindcheck} == "1" && ${addraincheck} == "1" ) + #set($addthreat = " HOWEVER ${addwind} AND ${addrain} ARE STILL POSSIBLE WITH ${stormTypePhrase}.") +#elseif (${addhailcheck} == "1" && ${addwindcheck} == "1" && ${addraincheck} == "1" ) + #set($addthreat = " HOWEVER ${addhail}....${addwind} AND ${addrain} ARE STILL POSSIBLE WITH ${stormTypePhrase}.") +#end + +${expcanPhrase} ${addthreat} + +########################################### +##OTHER EXP/CAN STATEMENT INFO +########################################### +## WATCHES ## +############# +###if(${list.contains($includedWatches, "torWatches")}) +###inserttorwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat}) +###end +###if(${list.contains($includedWatches, "svrWatches")}) +###insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat}) +###end +###end +#if(${list.contains($bullets, "svrboxactive")}) +${watchlead}...AND A SEVERE THUNDERSTORM WATCH REMAINS IN EFFECT UNTIL !** enter time here **! + +#end +#if (${list.contains($bullets, "torboxactive")}) +${watchlead}...AND A TORNADO WATCH REMAINS IN EFFECT UNTIL !** enter time here **! + +#end +#if(${list.contains($bullets, "reporttolaw")}) +TO REPORT SEVERE WEATHER...CONTACT YOUR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE ${officeLoc}. + +#end +#if(${list.contains($bullets, "svrwrngactive")}) +REMEMBER...A SEVERE THUNDERSTORM WARNING STILL REMAINS IN EFFECT FOR !** PORTION AND COUNTY NAMES UNTIL TIME **! + +#end +#if(${list.contains($bullets, "torwrngactive")}) +REMEMBER...A TORNADO WARNING STILL REMAINS IN EFFECT FOR !** PORTION AND COUNTY NAMES UNTIL TIME **! + +#end +#printcoords(${areaPoly}, ${list}) + +TIME...MOT...LOC ## +${dateUtil.format(${now}, ${timeFormat.time})}Z ## +${mathUtil.round(${movementDirection})}DEG ## +${mathUtil.round(${movementInKnots})}KT ## +#foreach(${eventCoord} in ${eventLocation}) +#llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## +#end + + +$$ +## +#end +## +################################################### +##### END CANCELLATION/EXPIRATION SECTION ######### +################################################### +## +## +################################################## +################################################## +## NOW LET'S DO OUR CONTINUATION SEGMENT ##### +################################################## +################################################## +#### +#### IF PARTIAL CANCELLATION, INSERT $$ AND 2ND UGC/MND SECTION PRIOR TO CON PORTION +#### +#if(${action}=="CANCON") + + +${ugcline} +/${productClass}.CON.${vtecOffice}.${phenomena}.W.${etn}.000000T0000Z-${dateUtil.format(${expire}, ${timeFormat.ymdthmz})}/ +#foreach (${area} in ${areas}) +${area.name} ${area.stateabbr}-## +#end + +${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} + +#if(${productClass}=="T") +...THIS MESSAGE IS FOR TEST PURPOSES ONLY... + +#end +#end +#if(${action}=="CANCON" || ${action}=="CON") +...A ${eventType} WARNING REMAINS IN EFFECT #secondBullet(${dateUtil},${expire},${timeFormat},${localtimezone},${secondtimezone}) FOR ## +#headlineLocList(${areas} true true true false) +...## +########### END NEW HEADLINE CODE #################### +##################################################################### +### TORNADO EMERGENCY PER NWS 10-511 DIRECTIVE # +##################################################################### + +#if(${list.contains($bullets, "torEmergency")}) + +...THIS IS A TORNADO EMERGENCY FOR !** EDIT LOCATION(S) **!... + +#end +#set($reportType = "!** BASIS FOR WARNING **!") +#set($reportAuthSVR = "") +############### BASIS SECTION #################### +#if(${list.contains($bullets, "dopplerTOR")}) + #if(${stormType} == "line") + #set($reportType = "A LINE OF SEVERE THUNDERSTORMS CAPABLE OF PRODUCING TORNADOES") + #set($reportType2 = "THESE DANGEROUS STORMS WERE") + #set($pathcastLead = "THESE DANGEROUS STORMS") + #else + #set($reportType = "A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A TORNADO") + #set($reportType2 = "THIS DANGEROUS STORM WAS") + #set($pathcastLead = "THIS DANGEROUS STORM") + #end +#elseif(${list.contains($bullets, "dopplerSquallTOR")}) + #set ($reportType = "A SEVERE SQUALL LINE CAPABLE OF PRODUCING BOTH TORNADOES AND EXTENSIVE STRAIGHT LINE WIND DAMAGE") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($source = "STORM SPOTTERS CONFIRMED TORNADO.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #set($reportType2 = "THESE DANGEROUS STORMS WERE") + #set($pathcastLead = "THESE DANGEROUS STORMS") +#elseif(${list.contains($bullets, "confirmedDopplerTOR")}) + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "STORM SPOTTERS CONFIRMED TORNADO.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set($reportType2 = "THESE TORNADIC STORMS WERE") + #set ($reportType = "A TORNADO PRODUCING STORM IS LOCATED") + #else + #set($reportType2 = "THIS TORNADO") + #set ($reportType = "A TORNADO PRODUCING STORMS ARE LOCATED") + #end + #set($preAmbleTOR = "TO REPEAT...A TORNADO HAS BEEN SIGHTED! TO PROTECT YOUR LIFE...") +#elseif(${list.contains($bullets, "confirmedLargeTOR")}) + #set($reportType = "NATIONAL WEATHER SERVICE DOPPLER RADAR AND STORM SPOTTERS WERE TRACKING A LARGE AND EXTREMELY DANGEROUS TORNADO") + #set($preAmbleTOR = "TO REPEAT...A LARGE...EXTREMELY DANGEROUS AND POTENTIALLY DEADLY TORNADO IS ON THE GROUND! TO PROTECT YOUR LIFE...") +#elseif(${list.contains($bullets, "spotterTOR")}) + #set($preAmbleTOR = "TO REPEAT...A TORNADO HAS BEEN SIGHTED! TO PROTECT YOUR LIFE...") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "WEATHER SPOTTERS CONFIRMED TORNADO.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #end +#elseif(${list.contains($bullets, "lawEnforcementTOR")}) + #set($preAmbleTOR = "TO REPEAT...A TORNADO HAS BEEN SIGHTED! TO PROTECT YOUR LIFE...") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "LAW ENFORCEMENT CONFIRMED TORNADO.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #end +#elseif(${list.contains($bullets, "emergencyManagementTOR")}) + #set($reportType = "EMERGENCY MANAGEMENT REPORTED A ${reportType1}") + #set($preAmbleTOR = "TO REPEAT...A TORNADO HAS BEEN SIGHTED! TO PROTECT YOUR LIFE...") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "EMERGENCY MANAGEMENT CONFIRMED TORNADO.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #end +#elseif(${list.contains($bullets, "publicTOR")}) + #set($preAmbleTOR = "TO REPEAT...A TORNADO HAS BEEN SIGHTED! TO PROTECT YOUR LIFE...") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "PUBLIC CONFIRMED TORNADO.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #end +#elseif(${list.contains($bullets, "spotterFunnelCloud")}) + #set($reportType = "TRAINED WEATHER SPOTTERS REPORTED A FUNNEL CLOUD") + #set ($source = "WEATHER SPOTTERS REPORTED FUNNEL CLOUD.") + #if(${stormType} == "line") + #set($reportType2 = "A TORNADO MAY DEVELOP AT ANY TIME. THESE DANGEROUS STORMS WERE") + #set($pathcastLead = "THESE DANGEROUS STORMS") + #else + #set($reportType2 = "A TORNADO MAY DEVELOP AT ANY TIME. THIS DANGEROUS STORM WAS") + #set($pathcastLead = "THIS DANGEROUS STORM") + #end +#elseif(${list.contains($bullets, "dopplerSVR")}) + #set($reportType = "A ${reportType1}") + #set($reportAuthSVR = "CAPABLE OF PRODUCING") + #set ($source = "RADAR INDICATED.") +#elseif(${list.contains($bullets, "trainedSpottersSVR")}) + #set($reportType = "A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "TRAINED WEATHER SPOTTERS.") +#elseif(${list.contains($bullets, "lawEnforcementSVR")}) + #set($reportType = "A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "LAW ENFORCEMENT.") +#elseif(${list.contains($bullets, "emergencyManagementSVR")}) + #set($reportType = "A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "EMERGENCY MANAGEMENT.") +#elseif(${list.contains($bullets, "publicSVR")}) + #set($reportType = "A ${reportType1}") + #set($reportAuthSVR = "PRODUCING") + #set ($source = "PUBLIC.") +#end + +############################################################################ +## IF A SIGNIFICANT TORNADO IS SELECTED THE FOLLOWING WILL OVERRIDE CERTAIN +## VARIABLES TO HEIGHTED AWARENESS OF THIS DANGEROUS SITUATION +############################################################################ +#if(${list.contains($bullets, "significantTornado")}) + #set ($reportType = "A ${confirmed}LARGE AND EXTREMELY DANGEROUS TORNADO") + #set ($torHazard = "DAMAGING TORNADO") + #set ($torThreat = "TORNADO DAMAGE THREAT...SIGNIFICANT ") + #set ($pdstor = "THIS IS A PARTICULARLY DANGEROUS SITUATION.") + #set ($torimpact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A LARGE...EXTREMELY DANGEROUS AND POTENTIALLY DEADLY TORNADO IS ON THE GROUND. TAKE IMMEDIATE ACTION TO PROTECT YOUR LIFE.") +#end +############################################################################ +## IF A TORNADO EMERGENCY IS SELECTED THE FOLLOWING WILL OVERRIDE CERTAIN +## VARIABLES TO HEIGHTED AWARENESS OF THIS DANGEROUS SITUATION +############################################################################ +#if(${list.contains($bullets, "torEmergency")}) + #set ($reportType = "TORNADO EMERGENCY FOR !** LOCATION **!. A CONFIRMED LARGE AND DESTRUCTIVE TORNADO") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DEADLY TORNADO") + #set ($torThreat = "TORNADO DAMAGE THREAT...CATASTROPHIC ") + #set ($pdstor = "THIS IS A PARTICULARLY DANGEROUS SITUATION.") + #set ($torimpact = "LIFE THREATENING SITUATION. EXTENSIVE DAMAGE TO HOMES AND BUILDINGS...UPROOTED TREES AND DEBRIS WILL RESTRICT ACCESS INTO MANY AREAS.") + #if(${stormType} == "line") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #if(${list.contains($bullets, "dopplerTOR")}) + #set ($source = "WEATHER SPOTTERS CONFIRMED TORNADO.") + #end + #set ($preAmble = "TO REPEAT...A LARGE...EXTREMELY DANGEROUS AND POTENTIALLY DEADLY TORNADO IS ON THE GROUND. TAKE IMMEDIATE ACTION TO PROTECT YOUR LIFE.") +#end + +################################################### +## HANDLE WIND POSSIBILITIES ###################### +################################################### +#set ($windSpeed = 0) +#set ($windImpact = "") +#set ($extensive = "") +#set ($windTag = "<50MPH") +#if(${list.contains($bullets, "60mphWind")}) + #set ($windThreat = "DAMAGING WINDS IN EXCESS OF 60 MPH") + #set ($windHazard = "60 MPH WIND GUSTS") + #set ($windSpeed = 60) + #set ($windTag = "60MPH") + #set ($windImpact = "LARGE TREE LIMBS BROKEN OFF PARTIALLY BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "70mphWind")}) + #set ($windThreat = "DESTRUCTIVE WINDS IN EXCESS OF 70 MPH") + #set ($windHazard = "70 MPH WIND GUSTS") + #set ($windSpeed = 70) + #set ($windTag = "70MPH") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "80mphWind")}) + #set ($windThreat = "DESTRUCTIVE WINDS IN EXCESS OF 80 MPH") + #set ($windHazard = "80 MPH WIND GUSTS") + #set ($windSpeed = 80) + #set ($windTag = "80MPH") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") +#end +#if(${list.contains($bullets, "90mphWind")}) + #set ($windThreat = "EXTREME DAMAGING WINDS IN EXCESS OF 90 MPH") + #set ($windHazard = "90 MPH WIND GUSTS") + #set ($windSpeed = 90) + #set ($windTag = "90MPH") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") +#end +#if(${list.contains($bullets, "100mphWind")}) + #set ($windThreat = "EXTREME DAMAGING WINDS IN EXCESS OF 100 MPH") + #set ($windHazard = "100 MPH WIND GUSTS") + #set ($windSpeed = 100) + #set ($windTag = "100MPH") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #set ($pdssvr = "THIS IS A VERY DANGEROUS STORM.") +#end +################################################### +## HANDLE HAIL POSSIBILITIES ###################### +################################################### +#set ($hailSize = 0) +#set ($smallHail = "") +#set ($hailImpact = "DAMAGE TO ROOFS AND WINDOWS.") +#if(${phenomena}=="TO") + #set ($hailTag = "1.75") + #set ($hailHazard = "GOLF BALL SIZE HAIL") +#end +#if(${list.contains($bullets, "nosevereHail")}) + #set ($hailThreat = "") + #set ($hailSize = 0.75) + #set ($hailTag = "<.75IN") + #set ($hailHazard = "SMALL HAIL") +#end +#if(${list.contains($bullets, "pennyHail")}) + #set ($hailThreat = "PENNY SIZE") + #set ($hailTrail = " HAIL") + #set ($hailLead = "") + #set ($hailSize = 0.75) + #set ($hailTag = "0.75IN") + #set ($hailHazard = "PENNY SIZE HAIL") +#end +#if(${list.contains($bullets, "nickelHail")}) + #set ($hailThreat = "NICKEL SIZE") + #set ($hailTrail = " HAIL") + #set ($hailLead = "") + #set ($hailSize = 0.88) + #set ($hailTag = "0.88IN") + #set ($hailHazard = "NICKEL SIZE HAIL") +#end +#if(${list.contains($bullets, "quarterHail")}) + #set ($hailThreat = "QUARTER SIZE") + #set ($hailTrail = " HAIL") + #set ($hailLead = "") + #set ($hailSize = 1.00) + #set ($hailTag = "1.00IN") + #set ($hailHazard = "QUARTER SIZE HAIL") +#end +#if(${list.contains($bullets, "halfdollarHail")}) + #set ($hailThreat = "HALF DOLLAR SIZE") + #set ($hailTrail = " HAIL") + #set ($hailLead = "") + #set ($hailSize = 1.25) + #set ($hailTag = "1.25IN") + #set ($hailHazard = "HALF DOLLAR SIZE HAIL") +#end +#if(${list.contains($bullets, "pingpongHail")}) + #set ($hailThreat = "PING PONG BALL SIZE") + #set ($hailLead = "LARGE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 1.50) + #set ($hailTag = "1.50IN") + #set ($hailHazard = "HALF DOLLAR SIZE HAIL") +#end +#if(${list.contains($bullets, "golfballHail")}) + #set ($hailThreat = "GOLF BALL SIZE") + #set ($hailLead = "LARGE DAMAGING HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 1.75) + #set ($hailTag = "1.75IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "GOLF BALL SIZE HAIL") +#end +#if(${list.contains($bullets, "twoinchHail")}) + #set ($hailThreat = "TWO INCHES IN DIAMETER") + #set ($hailLead = "LARGE DAMAGING HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 2.00) + #set ($hailTag = "2.00IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "HAIL UP TO TWO INCHES IN DIAMETER") +#end +#if(${list.contains($bullets, "tennisBallHail")}) + #set ($hailThreat = "TENNIS BALL SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 2.50) + #set ($hailTag = "2.50IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "TENNIS BALL SIZE HAIL") +#end +#if(${list.contains($bullets, "baseballHail")}) + #set ($hailThreat = "BASEBALL SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 2.75) + #set ($hailTag = "2.75IN") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "BASEBALL SIZE HAIL") +#end +#if(${list.contains($bullets, "threeinchHail")}) + #set ($hailThreat = "THREE INCHES IN DIAMETER") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 3.00) + #set ($hailTag = "3.00IN") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "HAIL UP TO THREE INCHES IN DIAMETER") +#end +#if(${list.contains($bullets, "softballHail")}) + #set ($hailThreat = "SOFTBALL SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 4.25) + #set ($hailTag = "4.25IN") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "SOFTBALL SIZE HAIL") +#end +#if(${list.contains($bullets, "grapefruitHail")}) + #set ($hailThreat = "GRAPEFRUIT SIZE") + #set ($hailLead = "LARGE DESTRUCTIVE HAIL UP TO ") + #set ($hailTrail = "") + #set ($hailSize = 4.00) + #set ($hailTag = "4.00IN") + #set ($extensive = "EXTENSIVE ") + #set ($hailImpact = "DAMAGE TO ROOFS...WINDOWS AND VEHICLES.") + #set ($hailHazard = "GRAPEFRUIT SIZE HAIL") +#end +################################################################## +######### CREATE SVR TSTM WIND AND HAIL SENTENCE/TAG############## +################################################################## +#set ($hailwind = "") +#if (${hailSize} < 1 && ${windSpeed} < 58) + #if (${phenomena}=="SV") + #set ($hailwind = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") + #set ($windhailTag = "WIND...HAIL <50MPH <.75IN") + #set ($svrimpact = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") + #set ($hazard = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") + #else + #set ($hailTag = "HAIL...<.75IN") + #end +#elseif(${hailSize} > 0 && ${windSpeed} > 0) + #if (${hailSize} < 1) + #set ($hailwind = " ${reportAuthSVR} ${windThreat}") + #if(${phenomena}=="SV") + #set ($smallHail = "${hailThreat}${hailTrail} MAY ALSO ACCOMPANY THE DAMAGING WINDS.") + #set ($svrimpact = "${extensive}${hailImpact} ${windImpact}") + #set ($hazard = "${windHazard} AND ${hailHazard}.") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${windHazard}...${hailHazard} AND POSSIBLE TORNADO.") + #end + #end + #else + #set ($hailwind = " ${reportAuthSVR} ${hailLead}${hailThreat}${hailTrail} AND ${windThreat}") + #set ($svrimpact = "${extensive}${hailImpact} ${windImpact}") + #set ($hazard = "${hailHazard} AND ${windHazard}.") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${hailHazard}...${windHazard} AND POSSIBLE TORNADO.") + #end + #end + #set ($windTag = "WIND...${windTag}") + #set ($hailTag = "HAIL...${hailTag}") +#elseif(${hailSize} > 0) + #set ($hailwind = " ${reportAuthSVR} ${hailLead}${hailThreat}${hailTrail}") + #set ($windhailTag = "WIND...HAIL <50MPH ${hailTag}") + #set ($windTag = "WIND...${windTag}") + #set ($hailTag = "HAIL...${hailTag}") + #set ($hazard = "${hailHazard}.") + #set ($svrimpact = "${extensive}${hailImpact} ${windImpact}") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${hailHazard} AND POSSIBLE TORNADO.") + #end +#elseif(${windSpeed} > 0) + #set ($hailwind = " ${reportAuthSVR} ${windThreat}") + #set ($windhailTag = "WIND...HAIL ${windTag} <.75IN") + #set ($windTag = "WIND...${windTag}") + #set ($hailTag = "HAIL...<.75IN") + #set ($hazard = "${windHazard}.") + #set ($svrimpact = "${extensive}${hailImpact} ${windImpact}") + #if(${list.contains($bullets, "svrTorTag")}) + #set ($hazard = "${windHazard} AND POSSIBLE TORNADO.") + #end +#end +########################################################## +## Set the hazard for a tornado warning follow-up ## +########################################################## +#if(${phenomena}=="TO") + #set ($pdssvr = "") + #set ($svrimpact = "") + #if (${windSpeed} >= 60) + #set ($hazard = "${torHazard}...${hailHazard} AND ${windHazard}.") + #else + #set ($hazard = "${torHazard} AND ${hailHazard}.") + #end +######################################################### +## If a significant or catastrophic tornado are selected +## do not include any wind or hail informadion +######################################################### +#if(${list.contains($bullets, "significantTornado")}) + #set ($hazard = "${torHazard}.") +#end +#if(${list.contains($bullets, "torEmergency")}) + #set ($hazard = "${torHazard}.") +#end +#end +######################################################## +######### CREATE TORNADO HAIL SENTENCE/TAG############## +######################################################## +#set($TORHailThreat = "") +#if (${hailSize} >= 1.5 && ${phenomena}=="TO") + #if(${stormType} == "line") + #set($TORHailThreat = "IN ADDITION TO TORNADOES...${hailLead}${hailThreat}${hailTrail} IS EXPECTED WITH THESE STORMS.") + #else + #set($TORHailThreat = "IN ADDITION TO A TORNADO...${hailLead}${hailThreat}${hailTrail} IS EXPECTED WITH THIS STORM.") + #end +#end +###################################################### +###### Storm current location description ########## +###################################################### +###################################################### +###### Add damage information to the source section +###### If Additional Information is selected +###################################################### +#foreach ($bullet in $bullets) +#if($bullet.startsWith("addl")) + #set ($extrasource = " !**ENTER TYPE OF DAMAGE**! WAS REPORTED !** ENTER LOCATION **!.") +#end +#end +#if(${list.contains($bullets, "addlTorInfo")}) + #set ($extrasource = " !**ENTER TYPE OF TORNADO DAMAGE**! WAS REPORTED !** ENTER LOCATION **!.") +#end +###################################################### +###### CREATE TIME/STORM/MOVEMENT REFERENCE ###### +###################################################### +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end + +AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...## +${reportType} LOCATED ## +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES",false) +#if($movementSpeed < 3 || ${stationary}) +#if(${stormType} == "line") +...AND ARE NEARLY STATIONARY. + #else +...AND IS NEARLY STATIONARY. +#end +#else +...MOVING #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. +#end + +########################################################################## +## Section to include the dangerous storm wording as well as the hazard ## +########################################################################## +${pdstor}${pdssvr} + +HAZARD...${hazard} + +SOURCE...${source}${extrasource} + +IMPACT...${svrimpact}${torimpact} + +############################################# +######## GENERATE ADDITIONAL REPORTS ####### +############################################# +#set ($extraReportTor = "") +#set ($extraReport = "") +#if(${list.contains($bullets, "addlTorInfo")}) + #set ($extraReportTor = "AT !**enter time, tornado/damage**! WAS REPORTED !**enter location**!. ") +#end +#if(${list.contains($bullets, "addlHailRpt")}) + #set ($extraReport = "IN ADDITION...AT !**enter time, hail**! WAS REPORTED !**enter location**!.") +#elseif(${list.contains($bullets, "addlWindRpt")}) + #set ($extraReport = "IN ADDITION...AT !**enter time, wind**! WAS REPORTED !**enter location**!.") +#elseif(${list.contains($bullets, "addlHailWindRpt")}) + #set ($extraReport = "IN ADDITION...AT !**enter time, hail and wind**! WAS REPORTED !**enter location**!.") +#end + +${extraReportTor}${extraReport} + +################################################## +######## GENERATE PATHCAST OR CITIES LIST ######## +################################################## +#if(${phenomena}=="SV" && ${stormType} == "line") +#set ($otherLead = "THESE SEVERE THUNDERSTORMS") +#elseif(${phenomena}=="SV") +#set ($otherLead = "THIS SEVERE THUNDERSTORM") +#elseif(${phenomena}=="TO" && ${stormType} == "line") +#set ($otherLead = "THESE TORNADIC STORMS") +#elseif(${phenomena}=="TO") +#set ($otherLead = "THIS TORNADIC THUNDERSTORM") +#end +#if(${list.contains($bullets, "pathcast")}) +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#pathCast("${pathcastLead} WILL BE NEAR..." ${otherLead} ${pathCast} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#elseif(${list.contains($bullets, "listofcities")}) +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#### THE THIRD ARGUMENT IS A NUMBER SPECIFYING THE NUMBER OF COLUMNS TO OUTPUT THE CITIES LIST IN +#### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT +#### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE +#### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! +#locationsList("LOCATIONS IMPACTED INCLUDE..." ${otherLead} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#else +LOCATIONS IMPACTED INCLUDE... +!** YOU DID NOT SELECT A PATHCAST OR LIST OF CITIES BULLET. PLEASE ENTER LOCATIONS IMPACTED **!. + +#end +############################################## +###### SPECIAL VENUE/EVENT CASE ############## +############################################## +#if(${list.contains($bullets, "specialEvent")}) +#if(${stormType} == "line") +THOSE ATTENDING THE !**now/venue name or location**! ARE IN THE PATH OF THESE STORMS AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW! + +#else +THOSE ATTENDING THE !**now/venue name or location**! ARE IN THE PATH OF THIS STORM AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW! + +#end +#end + +## parse file command here is to pull in mile marker info +## #parse("mileMarkers.vm") + +################################## +######### CALLS TO ACTION ######## +################################## +##Check to see if we've selected any calls to action. In our .cfg file +##we ended each CTA bullet ID with "CTA" for this reason as a 'trip' +#foreach ($bullet in $bullets) +#if($bullet.endsWith("CTA")) +#set ($ctaSelected = "YES") +#end +#end +## + +#if(${ctaSelected} == "YES") +PRECAUTIONARY/PREPAREDNESS ACTIONS... + +#end +#if(${list.contains($bullets, "defaultMobileCTA")}) +TAKE COVER NOW! MOVE TO A BASEMENT OR AN INTERIOR ROOM ON THE LOWEST FLOOR OF A STURDY BUILDING. AVOID WINDOWS. IF IN A MOBILE HOME...A VEHICLE OR OUTDOORS...MOVE TO THE CLOSEST SUBSTANTIAL SHELTER AND PROTECT YOURSELF FROM FLYING DEBRIS. + +#end +#if(${list.contains($bullets, "defaultUrbanCTA")}) +TAKE COVER NOW! MOVE TO A BASEMENT OR AN INTERIOR ROOM ON THE LOWEST FLOOR OF A STURDY BUILDING. AVOID WINDOWS. IF IN A VEHICLE OR OUTDOORS...MOVE TO THE CLOSEST SUBSTANTIAL SHELTER AND PROTECT YOURSELF FROM FLYING DEBRIS. + +#end +#if(${list.contains($bullets, "motoristsCTA")}) +MOTORISTS SHOULD NOT TAKE SHELTER UNDER HIGHWAY OVERPASSES. IF YOU CANNOT SAFELY DRIVE AWAY FROM THE TORNADO...AS A LAST RESORT...EITHER PARK YOUR VEHICLE AND STAY PUT...OR ABANDON YOUR VEHICLE AND LIE DOWN IN A LOW LYING AREA AND PROTECT YOURSELF FROM FLYING DEBRIS. + +#end +#if(${list.contains($bullets, "rainWrappedCTA")}) +HEAVY RAINFALL MAY HIDE THIS TORNADO. DO NOT WAIT TO SEE OR HEAR THE TORNADO. TAKE COVER NOW. + +#end +#if(${list.contains($bullets, "nighttimeCTA")}) +TORNADOES ARE EXTREMELY DIFFICULT TO SEE AND CONFIRM AT NIGHT. DO NOT WAIT TO SEE OR HEAR THE TORNADO. TAKE COVER NOW. + +#end +#if(${list.contains($bullets, "largeTORCTA")}) +A LARGE AND EXTREMELY DANGEROUS TORNADO IS ON THE GROUND. TAKE IMMEDIATE TORNADO PRECAUTIONS. THIS IS AN EMERGENCY SITUATION. + +#end +#if(${list.contains($bullets, "lawEnforcementCTA")}) +IF A TORNADO OR OTHER SEVERE WEATHER IS SPOTTED...REPORT IT TO THE NATIONAL WEATHER SERVICE OR YOUR LOCAL AUTHORITY WHO WILL SEND YOUR REPORT. THIS ACT MAY SAVE LIVES OF OTHERS IN THE PATH OF DANGEROUS WEATHER. + +#end +#if(${list.contains($bullets, "squallCTA")} && ${stormType} == "line") +THIS LINE OF THUNDERSTORMS IS CAPABLE OF PRODUCING TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. DO NOT WAIT TO SEE OR HEAR THE TORNADO. FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. + +#elseif(${list.contains($bullets, "squallCTA")}) +THIS CLUSTER OF THUNDERSTORMS IS CAPABLE OF PRODUCING TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. DO NOT WAIT TO SEE OR HEAR THE TORNADO. FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. + +#end +#if(${list.contains($bullets, "waterCTA")}) +IF ON OR NEAR !**NAME OF WATER BODY **!...GET AWAY FROM THE WATER AND MOVE TO SAFE SHELTER IMMEDIATELY. IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. SEVERE THUNDERSTORMS CAN PRODUCE LARGE CAPSIZING WAVES...EVEN ON SMALL BODIES OF WATER. MOVE INTO DOCK AND SEEK SAFE SHELTER NOW. DO NOT BE CAUGHT ON THE WATER IN A THUNDERSTORM. + +#end +## +#if(${list.contains($bullets, "torWatchRemainsInEffectCTA")}) +REMAIN ALERT FOR A POSSIBLE TORNADO! TORNADOES CAN DEVELOP QUICKLY FROM SEVERE THUNDERSTORMS. IF YOU SPOT A TORNADO GO AT ONCE INTO THE BASEMENT OR SMALL CENTRAL ROOM IN A STURDY STRUCTURE. + +#end +## +#if(${list.contains($bullets, "genericCTA")}) +FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. + +#end +## +#if(${list.contains($bullets, "canProduceTornadoesCTA")}) +UNDER CURRENT CONDITIONS TORNADO DEVELOPMENT IS NOT LIKELY...BUT TORNADOES CAN DEVELOP QUICKLY FROM SEVERE THUNDERSTORMS. ALTHOUGH ONE IS NOT IMMEDIATELY LIKELY...IF A TORNADO IS SPOTTED...ACT QUICKLY AND MOVE TO A PLACE OF SAFETY IN A STURDY STRUCTURE...SUCH AS A BASEMENT OR SMALL INTERIOR ROOM. + +#end +## +#if(${list.contains($bullets, "largeHailCTA")}) +PREPARE IMMEDIATELY FOR LARGE HAIL AND DEADLY CLOUD TO GROUND LIGHTNING. PEOPLE OUTSIDE SHOULD MOVE TO A SHELTER...INSIDE A STRONG BUILDING AND AWAY FROM WINDOWS. + +#end +## +#if(${list.contains($bullets, "veryLargeHailCTA")}) +PREPARE IMMEDIATELY FOR LARGE DESTRUCTIVE HAIL CAPABLE OF PRODUCING SIGNIFICANT DAMAGE. PEOPLE OUTSIDE SHOULD MOVE TO A SHELTER...INSIDE A STRONG BUILDING AND AWAY FROM WINDOWS. + +#end +## +#if(${list.contains($bullets, "largeHailWindCTA")}) +PREPARE IMMEDIATELY FOR LARGE HAIL AND DAMAGING WINDS. PEOPLE OUTSIDE SHOULD MOVE TO A SHELTER...INSIDE A STRONG BUILDING AND AWAY FROM WINDOWS. + +#end +## +#if(${list.contains($bullets, "historyHailCTA")}) +#if(${stormType} == "line") +THESE STORMS ARE PRODUCING LARGE HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +THIS STORM IS PRODUCING LARGE HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "historyWindCTA")}) +#if(${stormType} == "line") +THIS IS A VERY DANGEROUS SITUATION. THESE STORMS ARE PRODUCING WIDESPREAD WIND DAMAGE ACROSS !** ENTER LOCATION **!. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +THIS IS A VERY DANGEROUS SITUATION. THIS STORM IS PRODUCING WIDESPREAD WIND DAMAGE ACROSS !** ENTER LOCATION **!. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "historyWindHailCTA")}) +#if(${stormType} == "line") +THIS IS A VERY DANGEROUS SITUATION. THESE STORMS ARE PRODUCING DESTRUCTIVE WINDS AND LARGE DAMAGING HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +THIS IS A VERY DANGEROUS SITUATION. THIS STORM IS PRODUCING DESTRUCTIVE WINDS AND LARGE DAMAGING HAIL. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "lawEnforcementCTA")}) +TO REPORT SEVERE WEATHER CONTACT YOUR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL SEND YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE IN ${officeLoc}. + +#end +## +#if(${list.contains($bullets, "squallLineCTA")}) +#if(${stormType} == "line") +INTENSE SQUALL LINES CAN SOMETIMES PRODUCE BRIEF TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. ALTHOUGH NOT IMMEDIATELY LIKELY...IT IS BEST TO MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THESE STORMS MAY CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#else +INTENSE SQUALL LINES CAN SOMETIMES PRODUCE BRIEF TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. ALTHOUGH NOT IMMEDIATELY LIKELY...IT IS BEST TO MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THIS STORM MAY CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#end +#end +## +#if(${list.contains($bullets, "superCellsCTA")}) +THIS IS A SUPERCELL THUNDERSTORM. THEY ARE CAPABLE OF PRODUCING ALL TYPES OF SEVERE WEATHER...INCLUDING EXTREMELY LARGE HAIL...DESTRUCTIVE STRAIGHT LINE WINDS...AND TORNADOES. MOVE QUICKLY TO A SAFE SHELTER...SUCH AS AN INTERIOR ROOM...A BATHROOM OR CLOSET OR BASEMENT. + +#end +## +#if(${list.contains($bullets, "gustFrontOutflowCTA")}) +#if(${stormType} == "line") +WIND DAMAGE WITH THESE STORMS WILL OCCUR BEFORE ANY RAIN OR LIGHTNING. DO NOT WAIT FOR THE SOUND OF THUNDER BEFORE TAKING COVER. SEEK SHELTER IMMEDIATELY INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#else +WIND DAMAGE WITH THIS STORM WILL OCCUR BEFORE ANY RAIN OR LIGHTNING. DO NOT WAIT FOR THE SOUND OF THUNDER BEFORE TAKING COVER. SEEK SHELTER IMMEDIATELY INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. + +#end +#end +## +#if(${list.contains($bullets, "extremeWindsCTA")}) +#if(${stormType} == "line") +THIS IS AN EXTREMELY DANGEROUS SITUATION WITH TORNADO LIKE WIND SPEEDS EXPECTED. MOBILE HOMES AND HIGH PROFILE VEHICLES ARE ESPECIALLY SUSCEPTIBLE TO WINDS OF THIS MAGNITUDE AND MAY BE OVERTURNED. FOR YOUR PROTECTION MOVE IMMEDIATELY TO A SAFE SHELTER OR TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THESE STORMS HAVE THE POTENTIAL TO CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#else +THIS IS AN EXTREMELY DANGEROUS SITUATION WITH TORNADO LIKE WIND SPEEDS EXPECTED. MOBILE HOMES AND HIGH PROFILE VEHICLES ARE ESPECIALLY SUSCEPTIBLE TO WINDS OF THIS MAGNITUDE AND MAY BE OVERTURNED. FOR YOUR PROTECTION MOVE IMMEDIATELY TO A SAFE SHELTER OR TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. THIS STORM HAS THE POTENTIAL TO CAUSE SERIOUS INJURY AND SIGNIFICANT PROPERTY DAMAGE. + +#end +#end +## +#if(${list.contains($bullets, "lightningCTA")}) +#if(${stormType} == "line") +LARGE HAIL AND DAMAGING WINDS AND CONTINUOUS CLOUD TO GROUND LIGHTNING IS OCCURRING WITH THESE STORMS. MOVE INDOORS IMMEDIATELY. LIGHTNING IS ONE OF NATURES LEADING KILLERS. REMEMBER...IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. + +#else +LARGE HAIL AND DAMAGING WINDS AND CONTINUOUS CLOUD TO GROUND LIGHTNING IS OCCURRING WITH THIS STORM. MOVE INDOORS IMMEDIATELY. LIGHTNING IS ONE OF NATURES LEADING KILLERS. REMEMBER...IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. + +#end +#end +## +#if(${list.contains($bullets, "boatersCTA")}) +IF ON OR NEAR !**Name Of Lake**!...GET AWAY FROM THE WATER AND MOVE INDOORS OR INSIDE A VEHICLE. REMEMBER...LIGHTNING CAN STRIKE OUT TO 15 MILES FROM THE PARENT THUNDERSTORM. IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. MOVE TO SAFE SHELTER NOW. DO NOT BE CAUGHT ON THE WATER IN A THUNDERSTORM. + +#end +## +#if(${list.contains($bullets, "torrentialRainfallCTA")}) +#if(${stormType} == "line") +TORRENTIAL RAINFALL IS OCCURRING WITH THESE STORMS...AND MAY LEAD TO FLASH FLOODING. DO NOT DRIVE YOUR VEHICLE THROUGH FLOODED ROADWAYS. + +#else +TORRENTIAL RAINFALL IS OCCURRING WITH THIS STORM...AND MAY LEAD TO FLASH FLOODING. DO NOT DRIVE YOUR VEHICLE THROUGH FLOODED ROADWAYS. + +#end +#end +## +#if(${ctaSelected} == "YES") +&& + +#end +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. + +#end + +#printcoords(${areaPoly}, ${list}) + +TIME...MOT...LOC ## +${dateUtil.format(${event}, ${timeFormat.time})}Z ## +${mathUtil.round(${movementDirection})}DEG ## +${mathUtil.round(${movementInKnots})}KT ## +#foreach(${eventCoord} in ${eventLocation}) +#llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## +#end +################################################################## +## SVR Tornado/Wind/Hail Tags used by CR for the impact based Warning Experiment. +################################################################## + +#if(${phenomena}=="SV") + +${svrTorTag} +${hailTag} +${windTag} +#end +########################################################################### +## TOR Tornado/Hail/Wind Tags used by CR for the impact based Warning Experiment. +########################################################################### +#if(${phenomena}=="TO") + +TORNADO...${torTag} +#if($torThreat.length() > 0) +${torThreat} +#end +${hailTag} +## UNCOMMENT OUT THE LINE BELOW TO USE THE WIND TAG +##${windTag} +#end +## +########################################################################### +#end + + +$$ +############################################## +#### END CONTINUATION SECTON ################# +############################################## + +############################################## +## Code to pull the user name into the product +############################################## +##${user} +################################################################## +## If you decide to pull the user name from a file use this coding +################################################################## +##parse("name.vm") +!**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereWeatherStatement.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereWeatherStatement.xml new file mode 100644 index 0000000000..1df1e3feb2 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactSevereWeatherStatement.xml @@ -0,0 +1,582 @@ + + + ++ + + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactTornadoWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactTornadoWarning.vm new file mode 100644 index 0000000000..971a429fcf --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactTornadoWarning.vm @@ -0,0 +1,652 @@ +################################################################ +## TORNADO WARNING TEMPLATE ## +## FOR CR IMPACT BASED TOR INITIATIVE ## +## CREATED BY PHIL KURIMSKI - WFO DTX ## +## VERSION AWIPS II 1.0 -- 2-21-2012 OB12.1.1-1 ## +## VERSION AWIPS II 1.1 -- 2-29-2012 OB12.2.1-4 ## +################################################################ +## ESTABLISH SOME INITIAL VARIABLES +#set ($preAmble = "") +#set ($hailSize = 0) +#set ($reportType = "A TORNADO WAS REPORTED") +#set ($pathcastLead = "THIS TORNADIC STORM") +#set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") +#set ($torTag = "RADAR INDICATED") +#set ($torThreat = "") +#set ($pdstor = "") +#set ($confirmed = "") +#set ($torHazard = "POTENTIAL TORNADO") +#set ($source = "RADAR INDICATED ROTATION.") +#set ($extrasource = "") +#set ($impact = "EXTENSIVE DAMAGE TO ROOFS AND WINDOWS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#if(${stormType} == "line") + #set($reportType = "A LINE OF TORNADO PRODUCING STORMS WAS REPORTED") + #set($pathcastLead = "THESE TORNADIC STORMS") + #set($moveLead = " DOPPLER RADAR SHOWED THESE STORMS MOVING") +#end +## +################################################### +## HANDLE WIND POSSIBILITIES ###################### +################################################### +#set ($windSpeed = 50) +#set ($windImpact = "") +#set ($extensive = "") +#set ($windHazard = "") +#set ($windTag = "<50MPH") +#if(${list.contains($bullets, "60mphWind")}) + #set ($windThreat = "DAMAGING WINDS IN EXCESS OF 60 MPH") + #set ($windHazard = "60 MPH WIND GUSTS") + #set ($windSpeed = 60) + #set ($windTag = "60MPH") + #set ($windImpact = "LARGE TREE LIMBS BROKEN OFF PARTIALLY BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "70mphWind")}) + #set ($windThreat = "DESTRUCTIVE WINDS IN EXCESS OF 70 MPH") + #set ($windHazard = "70 MPH WIND GUSTS") + #set ($windSpeed = 70) + #set ($windTag = "70MPH") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "80mphWind")}) + #set ($windThreat = "DESTRUCTIVE WINDS IN EXCESS OF 80 MPH") + #set ($windHazard = "80 MPH WIND GUSTS") + #set ($windSpeed = 80) + #set ($windTag = "80MPH") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact = "TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "90mphWind")}) + #set ($windThreat = "EXTREME DAMAGING WINDS IN EXCESS OF 90 MPH") + #set ($windHazard = "90 MPH WIND GUSTS") + #set ($windSpeed = 90) + #set ($windTag = "90MPH") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact ="TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +#if(${list.contains($bullets, "100mphWind")}) + #set ($windThreat = "EXTREME DAMAGING WINDS IN EXCESS OF 100 MPH") + #set ($windHazard = "100 MPH WIND GUSTS") + #set ($windSpeed = 100) + #set ($windTag = "100MPH") + #set ($extensive = "EXTENSIVE ") + #set ($windImpact ="TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") +#end +####################################### +## HANDLE HAIL POSSIBILITIES ########## +####################################### +#set ($hailTag = "1.75") +#set ($hailHazard = "GOLF BALL SIZE HAIL") +#if(${list.contains($bullets, "nosevereHail")}) + #set ($hailThreat = "") + #set ($hailSize = 0.75) + #set ($hailTag = "<.75IN") + #set ($hailHazard = "SMALL HAIL") +#end +#if(${list.contains($bullets, "pennyHail")}) + #set ($hailThreat = "PENNY SIZE HAIL") + #set ($hailSize = 0.75) + #set ($hailTag = "0.75IN") + #set ($hailHazard = "PENNY SIZE HAIL") +#end +#if(${list.contains($bullets, "nickelHail")}) + #set ($hailThreat = "NICKEL SIZE HAIL") + #set ($hailSize = 0.88) + #set ($hailTag = "0.88IN") + #set ($hailHazard = "NICKEL SIZE HAIL") +#end +#if(${list.contains($bullets, "quarterHail")}) + #set ($hailThreat = "QUARTER SIZE HAIL") + #set ($hailSize = 1.00) + #set ($hailTag = "1.00IN") + #set ($hailHazard = "QUARTER SIZE HAIL") +#end +#if(${list.contains($bullets, "halfdollarHail")}) + #set ($hailThreat = "HALF DOLLAR SIZE HAIL") + #set ($hailSize = 1.25) + #set ($hailTag = "1.25IN") + #set ($hailHazard = "HALF DOLLAR SIZE HAIL") +#end +#if(${list.contains($bullets, "pingpongHail")}) + #set ($hailThreat = "PING PONG BALL SIZE") + #set ($hailSize = 1.50) + #set ($hailTag = "1.50IN") + #set ($hailHazard = "PING PONG BALL SIZE HAIL") +#end +#if(${list.contains($bullets, "golfballHail")}) + #set ($hailThreat = "LARGE DAMAGING HAIL UP TO GOLF BALL SIZE") + #set ($hailSize = 1.75) + #set ($hailTag = "1.75IN") + #set ($hailHazard = "GOLF BALL SIZE HAIL") +#end +#if(${list.contains($bullets, "twoinchHail")}) + #set ($hailThreat = "LARGE DAMAGING HAIL UP TO TWO INCHES IN DIAMETER") + #set ($hailSize = 2.00) + #set ($hailTag = "2.00IN") + #set ($hailHazard = "HAIL UP TO TWO INCHES IN DIAMETER") +#end +#if(${list.contains($bullets, "tennisBallHail")}) + #set ($hailThreat = "LARGE DESTRUCTIVE HAIL UP TO TENNIS BALL SIZE") + #set ($hailSize = 2.50) + #set ($hailTag = "2.50IN") + #set ($hailHazard = "TENNIS BALL SIZE HAIL") +#end +#if(${list.contains($bullets, "baseballHail")}) + #set ($hailThreat = "LARGE DESTRUCTIVE HAIL UP TO BASEBALL SIZE") + #set ($hailSize = 2.75) + #set ($hailTag = "2.75IN") + #set ($hailHazard = "BASEBALL SIZE HAIL") +#end +#if(${list.contains($bullets, "threeinchHail")}) + #set ($hailThreat = "LARGE DESTRUCTIVE HAIL UP TO THREE INCHES IN DIAMETER") + #set ($hailSize = 3.00) + #set ($hailTag = "3.00IN") + #set ($hailHazard = "HAIL UP TO THREE INCHES IN DIAMETER") +#end +#if(${list.contains($bullets, "grapefruitHail")}) + #set ($hailThreat = "DANGEROUS AND EXTREMELY LARGE DESTRUCTIVE HAIL UP TO GRAPEFRUIT SIZE") + #set ($hailSize = 4.00) + #set ($hailTag = "4.00IN") + #set ($hailHazard = "GRAPEFRUIT SIZE HAIL") +#end +#if(${list.contains($bullets, "softballHail")}) + #set ($hailThreat = "DANGEROUS AND EXTREMELY LARGE DESTRUCTIVE HAIL UP TO SOFTBALL SIZE") + #set ($hailSize = 4.25) + #set ($hailTag = "4.25IN") + #set ($hailHazard = "SOFTBALL SIZE HAIL") +#end +#if(${hailSize} >= 1.50) + #if(${stormType} == "line") + #set ($extraThreat = "IN ADDITION TO A TORNADO...${hailThreat} IS EXPECTED WITH THESE STORMS.") + #else + #set ($extraThreat = "IN ADDITION TO A TORNADO...${hailThreat} IS EXPECTED WITH THIS STORM.") + #end +#else + #set ($extraThreat = "") +#end +${WMOId} ${vtecOffice} 000000 ${BBBId} +TOR${siteId} + +${ugcline} +/${productClass}.${action}.${vtecOffice}.TO.W.${etn}.${dateUtil.format(${start}, ${timeFormat.ymdthmz})}-${dateUtil.format(${expire}, ${timeFormat.ymdthmz}, 15)}/ + +BULLETIN - EAS ACTIVATION REQUESTED +#if(${productClass}=="T") +TEST...TORNADO WARNING...TEST +#else +TORNADO WARNING +#end +NATIONAL WEATHER SERVICE ${officeShort} +#backupText(${backupSite}) +${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} +## end of addition +#if(${productClass}=="T") + +...THIS MESSAGE IS FOR TEST PURPOSES ONLY... +#end + +#headline(${officeLoc}, ${backupSite}) + +################## +## FIRST BULLET ## +################## +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +TORNADO WARNING FOR... +#firstBullet(${areas}) + +################### +## SECOND BULLET ## +################### +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#secondBullet(${dateUtil},${expire},${timeFormat},${localtimezone},${secondtimezone}) + +#if(${list.contains($bullets, "doppler")}) + #if(${stormType} == "line") + #set ($reportType = "A LINE OF SEVERE THUNDERSTORMS CAPABLE OF PRODUCING A TORNADO ARE LOCATED") + #set ($pathcastLead = "THESE DANGEROUS STORMS") + #else + #set ($reportType = "A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A TORNADO IS LOCATED") + #set ($pathcastLead = "THIS DANGEROUS STORM") + #end + #set ($moveLead = "..AND MOVING") +#end +#if(${list.contains($bullets, "dopplerSquall")}) + #set ($reportType = "A SEVERE SQUALL LINE CAPABLE OF PRODUCING BOTH TORNADOES AND EXTENSIVE STRAIGHT LINE WIND DAMAGE ARE LOCATED") + #set ($pathcastLead = "THIS DANGEROUS STORM") + #set ($moveLead = "..AND MOVING") +#end +#if(${list.contains($bullets, "confirmedDoppler")}) + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "STORM SPOTTERS CONFIRMED TORNADO.") + #set ($impact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($reportType = "A TORNADO PRODUCING STORM IS LOCATED") + #set ($pathcastLead = "THIS TORNADIC STORM") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end +#end +#* +#if(${list.contains($bullets, "confirmedLarge")}) + #set ($reportType = "NATIONAL WEATHER SERVICE DOPPLER RADAR AND STORM SPOTTERS WERE TRACKING A LARGE AND EXTREMELY DANGEROUS TORNADO") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #if(${stormType} == "line") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A LARGE...EXTREMELY DANGEROUS AND POTENTIALLY DEADLY TORNADO IS ON THE GROUND. TAKE IMMEDIATE ACTION TO PROTECT YOUR LIFE.") +#end +*# +#if(${list.contains($bullets, "spotter")}) + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "WEATHER SPOTTERS CONFIRMED TORNADO.") + #set ($impact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A TORNADO HAS BEEN CONFIRMED BY STORM SPOTTERS.") +#end +#if(${list.contains($bullets, "lawEnforcement")}) + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "LAW ENFORCEMENT CONFIRMED TORNADO.") + #set ($impact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A TORNADO HAS BEEN CONFIRMED BY LOCAL LAW ENFORCEMENT.") +#end +#if(${list.contains($bullets, "emergencyManagement")}) + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "EMERGENCY MANAGEMENT CONFIRMED TORNADO.") + #set ($impact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A TORNADO HAS BEEN CONFIRMED BY EMERGENCY MANAGEMENT OFFICIALS.") +#end +#if(${list.contains($bullets, "public")}) + #set ($torTag = "OBSERVED") + #set ($torHazard = "DAMAGING TORNADO") + #set ($confirmed = "CONFIRMED ") + #set ($source = "PUBLIC CONFIRMED TORNADO.") + #set ($impact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF TORNADO PRODUCING STORMS ARE LOCATED") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($reportType = "A CONFIRMED TORNADO IS LOCATED") + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A TORNADO HAS BEEN SIGHTED.") +#end +#if(${list.contains($bullets, "spotterFunnelCloud")}) + ##set ($reportType = "TRAINED WEATHER SPOTTERS REPORTED A FUNNEL CLOUD") + #set ($source = "WEATHER SPOTTERS REPORTED FUNNEL CLOUD.") + #if(${stormType} == "line") + #set ($reportType = "A LINE OF SEVERE THUNDERSTORMS CAPABLE OF PRODUCING A TORNADO ARE LOCATED") + #set ($pathcastLead = "THESE DANGEROUS STORMS") + #set ($moveLead = " A TORNADO MAY DEVELOP AT ANY TIME. DOPPLER RADAR SHOWED THESE DANGEROUS STORMS MOVING") + #else + #set ($reportType = "A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A TORNADO IS LOCATED") + #set ($pathcastLead = "THIS DANGEROUS STORM") + #set ($moveLead = " A TORNADO MAY DEVELOP AT ANY TIME. DOPPLER RADAR SHOWED THIS DANGEROUS STORM MOVING") + #end +#end + +############################################################################ +## IF A SIGNIFICANT TORNADO IS SELECTED THE FOLLOWING WILL OVERRIDE CERTAIN +## VARIABLES TO HEIGHTED AWARENESS OF THIS DANGEROUS SITUATION +############################################################################ +#if(${list.contains($bullets, "significantTornado")}) + #set ($reportType = "A ${confirmed}LARGE AND EXTREMELY DANGEROUS TORNADO") + #set ($torHazard = "DAMAGING TORNADO") + #set ($torThreat = "mi +mph + + ++ + + + + ++ + + +COR +CON +CAN +EXP ++ + +SV.W +TO.W ++ + + + + +false + + +true + + + +30 ++ + +30 ++ + + + + + + + + ++ ++ ++ + + ++ ++ + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.00 +AND +0 +COUNTYNAME + +NAME +STATE +countyTypes.txt +FIPS + +NAME ++ +parent ++ ++ ++ 25 ++ + +NAME +POINTS ++ ++ ++ 1 +50 ++ +distance +warngenlev +population ++ + +NAME +POINTS ++ ++ ++ 5 +100 ++ +distance ++ + +true +8.0 +5 +5 +4 +8 +Name +COUNTYNAME + +STATE +STATE +countyTypes.txt ++ +distance +population ++ ++ ++ + + +NAME +TRACK +true +20 +10 ++ ++ ++ + +warngenlev +population ++ + + +NAME +TRACK +true +10 +10 ++ +distance ++ ++ ++ + + + +City +States +County + +TIMEZONES +TIME_ZONE +TORNADO DAMAGE THREAT...SIGNIFICANT ") + #set ($pdstor = "THIS IS A PARTICULARLY DANGEROUS SITUATION.") + #set ($impact = "EXTENSIVE DAMAGE TO HOMES AND BUILDINGS. TREES TO BE UPROOTED BLOCKING ROADS...DAMAGING BUILDINGS...HOMES AND DOWNING POWER LINES.") + #if(${stormType} == "line") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #set ($preAmble = "TO REPEAT...A LARGE...EXTREMELY DANGEROUS AND POTENTIALLY DEADLY TORNADO IS ON THE GROUND. TAKE IMMEDIATE ACTION TO PROTECT YOUR LIFE.") +#end +############################################################################ +## IF A TORNADO EMERGENCY IS SELECTED THE FOLLOWING WILL OVERRIDE CERTAIN +## VARIABLES TO HEIGHTED AWARENESS OF THIS DANGEROUS SITUATION +############################################################################ +#if(${list.contains($bullets, "torEmergency")}) + #set ($reportType = "TORNADO EMERGENCY FOR !** LOCATION **!. A CONFIRMED LARGE AND DESTRUCTIVE TORNADO") + #set ($torTag = "OBSERVED") + #set ($torHazard = "DEADLY TORNADO") + #set ($torThreat = "TORNADO DAMAGE THREAT...CATASTROPHIC ") + #set ($pdstor = "THIS IS A PARTICULARLY DANGEROUS SITUATION.") + #set ($impact = "LIFE THREATENING SITUATION. EXTENSIVE DAMAGE TO HOMES AND BUILDINGS...UPROOTED TREES AND DEBRIS WILL RESTRICT ACCESS INTO MANY AREAS.") + #if(${stormType} == "line") + #set ($pathcastLead = "THESE TORNADIC STORMS") + #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") + #else + #set ($pathcastLead = "THE TORNADO") + #set ($moveLead = " DOPPLER RADAR SHOWED THIS TORNADO MOVING") + #end + #if(${list.contains($bullets, "doppler")}||${list.contains($bullets, "dopplerSquall")}) + #set ($source = "WEATHER SPOTTERS CONFIRMED TORNADO.") + #end + #set ($preAmble = "TO REPEAT...A LARGE...EXTREMELY DANGEROUS AND POTENTIALLY DEADLY TORNADO IS ON THE GROUND. TAKE IMMEDIATE ACTION TO PROTECT YOUR LIFE.") +#end + +#################################################### +############# THIRD BULLET ######################### +#################################################### +###################################################### +###### Add damage information to the source section +###### If Additional Information is selected +###################################################### +#foreach ($bullet in $bullets) +#if($bullet.startsWith("extraReport")) + #set ($extrasource = " !**ENTER TYPE OF DAMAGE**! WAS REPORTED !** ENTER LOCATION **!.") +#end +#end +#if(${list.contains($bullets, "extraReportTornado")}) + #set ($extrasource = " !**ENTER TYPE OF TORNADO DAMAGE**! WAS REPORTED !** ENTER LOCATION **!.") +#end +########################################################## +## Check to see if wind is selected for the hazard phrase +########################################################## +#if (${windSpeed} >= 60) + #set ($hazard = "${torHazard}...${hailHazard} AND ${windHazard}") +#else + #set ($hazard = "${torHazard} AND ${hailHazard}") +#end +######################################################### +## If a significant or catastrophic tornado are selected +## do not include any wind or hail informadion +######################################################### +#if(${list.contains($bullets, "significantTornado")}) + #set ($hazard = "${torHazard}") +#end +#if(${list.contains($bullets, "torEmergency")}) + #set ($hazard = "${torHazard}") +#end +###################################################### +###### Storm current location description ########## +###################################################### + +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...${reportType} ## +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES", false) +#if($movementSpeed < 3 || ${stationary}) +#if(${stormType} == "line") +...AND ARE NEARLY STATIONARY. +#else +...AND IS NEARLY STATIONARY. +#end +#else +...MOVING #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. +#end + +########################################################################## +## Section to include the dangerous storm wording as well as the hazard ## +########################################################################## +${pdstor} + +HAZARD...${hazard}. + +SOURCE...${source}${extrasource} + +IMPACT...${impact} + +##################################################################### +### TORNADO EMERGENCY PER NWS 10-511 DIRECTIVE GOES WITH 3RD BULLET # +##################################################################### +#* +#if(${list.contains($bullets, "torEmergency")}) +THIS IS A TORNADO EMERGENCY FOR !** EDIT LOCATION(S) **!...TAKE IMMEDIATE TORNADO PRECAUTIONS NOW. + +#end +*# +############################ +### HAIL THREAT AS WELL? ### +############################ +#* +#if (${extraThreat} != "") +${extraThreat} + +#end +*# +############################ +### ADDITIONAL REPORTS #### +############################ +#if(${list.contains($bullets, "extraReportTornado")}) +AT !**ENTER TIME, TORNADO/DAMAGE INFO**! WAS REPORTED !** ENTER LOCATION **!. + +#end +#if(${list.contains($bullets, "extraReportHail")}) +#if(${stormType} == "line") +IN ADDITION...AT !**ENTER TIME, HAIL SIZE**! WAS REPORTED !** ENTER LOCATION **! WITH THESE STORMS. + +#else +IN ADDITION...AT !**ENTER TIME, HAIL SIZE**! WAS REPORTED !** ENTER LOCATION **! WITH THIS STORM. + +#end +#end +#if(${list.contains($bullets, "extraReportWind")}) +#if(${stormType} == "line") +IN ADDITION...AT !**ENTER TIME, WIND INFO**! WAS REPORTED !** ENTER LOCATION **! WITH THESE STORMS. + +#else +IN ADDITION...AT !**ENTER TIME, WIND INFO**! WAS REPORTED !** ENTER LOCATION **! WITH THIS STORM. + +#end +#end +#if(${list.contains($bullets, "extraReportHailWind")}) +#if(${stormType} == "line") +IN ADDITION...AT !**ENTER TIME, HAIL/WIND INFO**! WERE REPORTED !** ENTER LOCATION **! WITH THESE STORMS. + +#else +IN ADDITION...AT !**ENTER TIME, HAIL/WIND INFO**! WERE REPORTED !** ENTER LOCATION **! WITH THIS STORM. + +#end +#end +################################################### +######## GENERATE PATHCAST OR CITIES LIST ######### +################################################### +#if(${stormType} == "line") +#set ($otherLead = "THESE TORNADIC STORMS") +#else +#set ($otherLead = "THIS TORNADIC THUNDERSTORM") +#end +#if(${list.contains($bullets, "pathcast")}) +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#pathCast("${pathcastLead} WILL BE NEAR..." ${otherLead} ${pathCast} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#elseif(${list.contains($bullets, "listofcities")}) +* ## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. ## +#end +#### THE THIRD ARGUMENT IS A NUMBER SPECIFYING THE NUMBER OF COLUMNS TO OUTPUT THE CITIES LIST IN +#### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT +#### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE +#### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! +#locationsList("LOCATIONS IMPACTED INCLUDE..." ${otherLead} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#else +* LOCATIONS IMPACTED INCLUDE... + !** YOU DID NOT SELECT A PATHCAST OR LIST OF CITIES BULLET. PLEASE ENTER LOCATIONS IMPACTED **!. + +#end +############################################## +###### SPECIAL VENUE/EVENT CASE ############## +############################################## +#if(${list.contains($bullets, "specialEvent")}) +#if(${stormType} == "line") +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF THESE STORMS AND SHOULD PREPARE FOR IMMINENT DANGEROUS AND POTENTIALLY LIFE THREATENING WEATHER CONDITIONS. SEEK SHELTER NOW. + +#else +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF THIS STORM AND SHOULD PREPARE FOR IMMINENT DANGEROUS AND POTENTIALLY LIFE THREATENING WEATHER CONDITIONS. SEEK SHELTER NOW. + +#end +#end + +## parse file command here is to pull in mile marker info +## #parse("mileMarkers.vm") + +##################### +## CALL TO ACTIONS ## +##################### +###Check to see if we've selected any calls to action. In our .cfg file +##we ended each CTA bullet ID with "CTA" for this reason as a 'trip' +#foreach ($bullet in $bullets) +#if($bullet.endsWith("CTA")) +#set ($ctaSelected = "YES") +#end +#end +## +#if(${ctaSelected} == "YES") +PRECAUTIONARY/PREPAREDNESS ACTIONS... + +#end +## +#if(${list.contains($bullets, "replacesSVRCTA")}) +THIS TORNADO WARNING REPLACES THE SEVERE THUNDERSTORM WARNING ISSUED FOR THE SAME AREA. + +#end +#if(${list.contains($bullets, "defaultMobileCTA")}) +TAKE COVER NOW! MOVE TO A BASEMENT OR AN INTERIOR ROOM ON THE LOWEST FLOOR OF A STURDY BUILDING. AVOID WINDOWS. IF IN A MOBILE HOME...A VEHICLE OR OUTDOORS...MOVE TO THE CLOSEST SUBSTANTIAL SHELTER AND PROTECT YOURSELF FROM FLYING DEBRIS. + +#end +#if(${list.contains($bullets, "defaultUrbanCTA")}) +TAKE COVER NOW! MOVE TO A BASEMENT OR AN INTERIOR ROOM ON THE LOWEST FLOOR OF A STURDY BUILDING. AVOID WINDOWS. IF IN A VEHICLE OR OUTDOORS...MOVE TO THE CLOSEST SUBSTANTIAL SHELTER AND PROTECT YOURSELF FROM FLYING DEBRIS. + +#end +#if(${list.contains($bullets, "motoristsCTA")}) +MOTORISTS SHOULD NOT TAKE SHELTER UNDER HIGHWAY OVERPASSES. IF YOU CANNOT SAFELY DRIVE AWAY FROM THE TORNADO...AS A LAST RESORT...EITHER PARK YOUR VEHICLE AND STAY PUT...OR ABANDON YOUR VEHICLE AND LIE DOWN IN A LOW LYING AREA AND PROTECT YOURSELF FROM FLYING DEBRIS. + +#end +#if(${list.contains($bullets, "rainWrappedCTA")}) +HEAVY RAINFALL MAY HIDE THIS TORNADO. DO NOT WAIT TO SEE OR HEAR THE TORNADO. TAKE COVER NOW. + +#end +#if(${list.contains($bullets, "nighttimeCTA")}) +TORNADOES ARE EXTREMELY DIFFICULT TO SEE AND CONFIRM AT NIGHT. DO NOT WAIT TO SEE OR HEAR THE TORNADO. TAKE COVER NOW. + +#end +#if(${list.contains($bullets, "largeTORCTA")}) +A LARGE AND EXTREMELY DANGEROUS TORNADO IS ON THE GROUND. TAKE IMMEDIATE TORNADO PRECAUTIONS. THIS IS AN EMERGENCY SITUATION. + +#end +#if(${list.contains($bullets, "lawEnforcementCTA")}) +TO REPORT SEVERE WEATHER CONTACT YOUR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL SEND YOUR REPORT TO THE NATIONAL WEATHER SERVICE OFFICE IN ${officeLoc}. + +#end +## +#if(${list.contains($bullets, "squallCTA")} && ${stormType} == "line") +THIS LINE OF THUNDERSTORMS IS CAPABLE OF PRODUCING TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. DO NOT WAIT TO SEE OR HEAR THE TORNADO. FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. + +#elseif(${list.contains($bullets, "squallCTA")}) +THIS CLUSTER OF THUNDERSTORMS IS CAPABLE OF PRODUCING TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. DO NOT WAIT TO SEE OR HEAR THE TORNADO. FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF A BUILDING. + +#end +#if(${list.contains($bullets, "waterCTA")}) +IF ON OR NEAR !**NAME OF WATER BODY **!...GET AWAY FROM THE WATER AND MOVE TO SAFE SHELTER IMMEDIATELY. IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. SEVERE THUNDERSTORMS CAN PRODUCE LARGE CAPSIZING WAVES...EVEN ON SMALL BODIES OF WATER. MOVE INTO DOCK AND SEEK SAFE SHELTER NOW. DO NOT BE CAUGHT ON THE WATER IN A THUNDERSTORM. + +#end +#if(${ctaSelected} == "YES") +&& +#end +######################## +## LAT/LON, TML, SIGN ## +######################## +#if(${productClass}=="T") +THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. + +#end + +#printcoords(${areaPoly}, ${list}) + +TIME...MOT...LOC ## +${dateUtil.format(${event}, ${timeFormat.time})}Z ## +${mathUtil.round(${movementDirection})}DEG ## +${mathUtil.round(${movementInKnots})}KT ## +#foreach(${eventCoord} in ${eventLocation}) +#llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## +#end + +########################################################################### +## UNCOMMENT 2 LINES BELOW IF YOU ARE PARTICIPATING IN THE HAIL TAG TESTBED +## +##HAIL ${hailTag} +########################################################################### +########################################################################### +########################################################################### +## Tornado/Hail/Wind Tags used by CR for the impact based Warning Experiment. +########################################################################### + +TORNADO...${torTag} +#if($torThreat.length() > 0) +${torThreat} +#end +HAIL...${hailTag} +## UNCOMMENT OUT THE LINE BELOW TO USE THE WIND TAG +##WIND...${windTag} + +$$ + +############################################## +## Code to pull the user name into the product +############################################## +##${user} +################################################################## +## If you decide to pull the user name from a file use this coding +################################################################## +##parse("name.vm") +!**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactTornadoWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactTornadoWarning.xml new file mode 100644 index 0000000000..150ff6c377 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/impactTornadoWarning.xml @@ -0,0 +1,338 @@ + + + ++ + + + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.vm index fd2a7ef310..ee097514ec 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.vm @@ -7,6 +7,14 @@ ## VERSION AWIPS II 1.3 -- SEP 22 2011 OB11.8 ## ## VERSION AWIPS II 1.4 -- JAN 25 2012 OB12.1.1-1 ## ## Added coding for no headline in Version 1.4 ## +## VERSION AWIPS II 1.5 -- MAR 2 2012 OB12.2.1-4 ## +## Added coding for dense fog in Version 1.5 ## +##################################################### +## Set the visibility variable to be used for dense fog +## This variable can be changed by the local office and will +## set the visibility in the 3rd bullet and dense fog CTA +##################################################### +#set ($visibility = "1 MILE") ##################################################### ## Set null variables used in the template ##################################################### @@ -47,71 +55,99 @@ ${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} ## Assume head1 is selected. #set ($headerType = "STRONG THUNDERSTORM") #set ($eventType = "THUNDERSTORM") - #set ($reportLocation = "THIS THUNDERSTORM WAS LOCATED") +#set ($reportLocation = "THIS THUNDERSTORM WAS LOCATED") ## Do not add any spaces or tabs to the next line ## Otherwise the headline in the product will have extra spaces #if(${stormType} == "line") - #set ($reportLocation = "THESE THUNDERSTORMS WERE LOCATED") + #set ($reportLocation = "THESE THUNDERSTORMS WERE LOCATED") #end #if(${list.contains($bullets, "shower")}) - #set ($headerType = "SHOWER") - #set ($eventType = "SHOWER") - #set ($reportLocation = "THIS SHOWER WAS LOCATED") - #if(${stormType} == "line") - #set ($reportLocation = "THESE SHOWERS WERE LOCATED") - #end + #set ($headerType = "SHOWER") + #set ($eventType = "SHOWER") + #set ($reportLocation = "THIS SHOWER WAS LOCATED") +## Do not add any spaces or tabs to the next line +## Otherwise the headline in the product will have extra spaces +#if(${stormType} == "line") + #set ($reportLocation = "THESE SHOWERS WERE LOCATED") +#end #end #if(${list.contains($bullets, "cloud")}) - #set ($headerType = "CLOUD") - #set ($eventType = "CLOUD") - #set ($reportLocation = "THIS CLOUD FEATURE WAS LOCATED") + #set ($headerType = "CLOUD") + #set ($eventType = "CLOUD") + #set ($reportLocation = "THIS CLOUD FEATURE WAS LOCATED") #end #if(${list.contains($bullets, "front")}) - #set ($headerType = "FRONT") - #set ($eventType = "FRONT") - #set ($reportLocation = "THIS FRONT WAS LOCATED") + #set ($headerType = "FRONT") + #set ($eventType = "FRONT") + #set ($reportLocation = "THIS FRONT WAS LOCATED") +#end +#if(${list.contains($bullets, "fog")}) + #set ($headerType = "DENSE FOG") + #set ($eventType = "DENSE FOG") + #set ($reportLocation = "THE DENSE FOG WAS LOCATED") #end ####################################################################### ## Section to create line wording based on track type. ####################################################################### -#set ($stormline = "${headerType}") -#set ($pathheader = "THE ${headerType}") +#set($stormline = "${headerType}") +#set($pathheader = "THE ${headerType}") +#set($specialEvent = "THIS ${eventType}") +#set($reportType2 = "THE ${eventType} WAS") #if(${stormType} == "line") - #set($stormline = "LINE OF ${headerType}S") - #set($pathheader = "${headerType}S") - #set($headerType = "A ${headerType}S") + #set($stormline = "LINE OF ${headerType}S") + #set($pathheader = "${headerType}S") + #set($specialEvent = "THESE ${eventType}S") + #set($headerType = "A ${headerType}S") + #set($reportType2 = "THE ${eventType}S WERE") #end ####################################################################### ## Corrective coding to prevent the use of "Line of Fronts" in the Product ####################################################################### #if(${eventType} == "FRONT") - #set($stormline = "${eventType}") - #set($pathheader = "THE ${eventType}") + #set($stormline = "${eventType}") + #set($pathheader = "THE ${eventType}") + #set($specialEvent = "THIS ${eventType}") + #set($reportType2 = "THE ${eventType} WAS") +#end +####################################################################### +## Corrective coding to prevent the use of "Line of Dense Fog" in the Product +####################################################################### +#if(${eventType} == "DENSE FOG") + #set($stormline = "${eventType}") + #set($pathheader = "THE ${eventType}") + #set($specialEvent = "THIS ${eventType}") + #set($reportType2 = "THE ${eventType} WAS") #end #if(${eventType} == "CLOUD") - #set($pathheader = "THE STRONG WINDS") + #set($pathheader = "THE STRONG WINDS") #end #set ($threatType = "WINDS UP TO 33 KNOTS") -#set ($headerType1 = "...STRONG WINDS EXPECTED...") + #set ($headerType1 = "...STRONG WINDS EXPECTED...") #if(${list.contains($bullets, "approachHead")}) + #set($headerType1 = "...${stormline} APPROACHING THE WATERS...") +#* #if(${eventType} == "THUNDERSTORM") - #set($headerType1 = "...${stormline} APPROACHING THE WATERS...") + #set($headerType1 = "...${stormline} APPROACHING THE WATERS...") #else - #set($headerType1 = "...STRONG WINDS EXPECTED...") + #set($headerType1 = "...STRONG WINDS EXPECTED...") #end +*# #end #if(${list.contains($bullets, "overHead")}) +#set($headerType1 = "...${stormline} OVER THE WATERS...") +#* #if (${eventType} == "THUNDERSTORM") - #set($headerType1 = "...${stormline} OVER THE WATERS...") + #set($headerType1 = "...${stormline} OVER THE WATERS...") #else - #set($headerType1 = "...STRONG WINDS EXPECTED...") + #set($headerType1 = "...STRONG WINDS EXPECTED...") #end +*# #end ####################################################################### ## Added Hail Section ####################################################################### #if(${list.contains($bullets, "smallHail")}) - #set ($hailType = " AND SMALL HAIL") + #set ($hailType = " AND SMALL HAIL") #end ####################################################################### ## Section to produce areas affected by statement @@ -170,19 +206,42 @@ $zonecombo #if(${list.contains($bullets, "doppler")}) #set ($capable = "CAPABLE OF ") #set ($report = "DOPPLER RADAR INDICATED A ${stormline}...${capable}PRODUCING ${threatType}${hailType}.") +#if(${list.contains($bullets, "fog")}) + #set ($capable = "CAPABLE OF ") + #set ($report = "DOPPLER RADAR INDICATED AN AREA OF ${stormline}...${capable}REDUCING VISIBILITIES TO BELOW ${visibility}.") +#end #end #if(${list.contains($bullets, "marineSpotter")}) #set ($report = "MARINE WEATHER SPOTTERS REPORTED A ${stormline}...${capable}PRODUCING ${threatType}${hailType}.") +#if(${list.contains($bullets, "fog")}) + #set ($report = "MARINE WEATHER SPOTTERS REPORTED AN AREA OF ${stormline}...${capable}REDUCING VISIBILITIES TO BELOW ${visibility}.") +#end #end #if(${list.contains($bullets, "mariner")}) #set ($report = "A MARINER REPORTED A ${stormline}...${capable}PRODUCING ${threatType}${hailType}.") +#if(${list.contains($bullets, "fog")}) + #set ($report = "A MARINER REPORTED AN AREA OF ${stormline}...${capable}REDUCING VISIBILITIES TO BELOW ${visibility}.") +#end #end #if(${list.contains($bullets, "public")}) #set ($report = "THE PUBLIC REPORTED A ${stormline}...${capable}PRODUCING ${threatType}${hailType}.") +#if(${list.contains($bullets, "fog")}) + #set ($report = "THE PUBLIC REPORTED AN AREA OF ${stormline}...${capable}REDUCING VISIBILITIES TO BELOW ${visibility}.") +#end #end #if(${list.contains($bullets, "satellite")}) #set ($capable = "CAPABLE OF ") #set ($report = "SATELLITE IMAGERY INDICATED A ${stormline}...${capable}PRODUCING ${threatType}${hailType}.") +#if(${list.contains($bullets, "fog")}) + #set ($capable = "CAPABLE OF ") + #set ($report = "SATELLITE IMAGERY INDICATED AN AREA OF ${stormline}...${capable}REDUCING VISIBILITIES TO BELOW ${visibility}.") +#end +#end +#if(${list.contains($bullets, "pilot")}) + #set ($report = "A PILOT REPORTED A ${stormline}...${capable}PRODUCING ${threatType}${hailType}.") +#if(${list.contains($bullets, "fog")}) + #set ($report = "A PILOT REPORTED AN AREA OF ${stormline}...${capable}REDUCING VISIBILITIES TO BELOW ${visibility}.") +#end #end ## Storm current location description #if(${productClass}=="T") @@ -220,13 +279,8 @@ THIS IS A TEST MESSAGE. ## ############################################## #if(${list.contains($bullets, "specialEvent")}) -#if(${stormType} == "line") -THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THESE STORMS AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF ${specialEvent} AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. -#else -THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THIS STORM AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. - -#end #end ##################### ## CALL TO ACTIONS ## @@ -256,11 +310,11 @@ MARINERS CAN EXPECT GUSTY WINDS UP TO 33 KNOTS...LOCALLY HIGHER WAVES...LIGHTNIN #end #if(${list.contains($bullets, "possibleSmwCTA")}) -THIS ${stormline} WILL LIKELY PRODUCE STRONG WINDS UP TO 33 KNOTS...AND COULD POSE A SERIOUS HAZARD FOR BOATERS. A SPECIAL MARINE WARNING MAY EVENTUALLY BE REQUIRED WHEN THIS STORM REACHES THE NEARSHORE WATERS. BOATERS SHOULD CONSIDER HEADING FOR SHORE BEFORE THE STORM ARRIVES. +THIS ${stormline} WILL LIKELY PRODUCE WINDS UP TO 33 KNOTS...AND COULD POSE A SERIOUS HAZARD FOR BOATERS. A SPECIAL MARINE WARNING MAY EVENTUALLY BE REQUIRED WHEN THIS STORM REACHES THE NEARSHORE WATERS. BOATERS SHOULD CONSIDER HEADING FOR SHORE BEFORE THE STORM ARRIVES. #end #if(${list.contains($bullets, "likelySmwCTA")}) -THIS ${stormline} WILL LIKELY PRODUCE STRONG WINDS IN EXCESS OF 34 KNOTS...AND IS LIKELY TO POSE A SERIOUS HAZARD FOR BOATERS. A SPECIAL MARINE WARNING WILL LIKELY BE REQUIRED WHEN THIS STORM REACHES THE NEARSHORE WATERS. BOATERS SHOULD CONSIDER HEADING FOR SHORE BEFORE THE STORM ARRIVES. +THIS ${stormline} WILL LIKELY PRODUCE WINDS IN EXCESS OF 34 KNOTS...AND IS LIKELY TO POSE A SERIOUS HAZARD FOR BOATERS. A SPECIAL MARINE WARNING WILL LIKELY BE REQUIRED WHEN THIS STORM REACHES THE NEARSHORE WATERS. BOATERS SHOULD CONSIDER HEADING FOR SHORE BEFORE THE STORM ARRIVES. #end #if(${list.contains($bullets, "lightningCTA")}) @@ -268,11 +322,11 @@ INTENSE LIGHTNING IS OCCURRING WITH THIS STORM. IF CAUGHT ON THE OPEN WATER STAY #end #if(${list.contains($bullets, "reportCTA")}) -REPORT SEVERE WEATHER TO THE COAST GUARD. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE FORECAST OFFICE. +REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY WILL RELAY YOUR REPORT TO THE NATIONAL WEATHER SERVICE FORECAST OFFICE. #end #if(${list.contains($bullets, "fogCTA")}) -DENSE FOG WAS REDUCING VISIBILITIES TO BELOW 1/4 MILE. REDUCE YOUR SPEED...AND KEEP A LOOKOUT FOR OTHER VESSELS...BUOYS...AND BREAKWATERS. KEEP YOUR NAVIGATION LIGHTS ON. IF NOT EQUIPPED WITH RADAR...YOU SHOULD CONSIDER SEEKING SAFE HARBOR. +DENSE FOG WAS REDUCING VISIBILITIES TO BELOW ${visibility}. REDUCE YOUR SPEED...AND KEEP A LOOKOUT FOR OTHER VESSELS...BUOYS...AND BREAKWATERS. KEEP YOUR NAVIGATION LIGHTS ON. IF NOT EQUIPPED WITH RADAR...YOU SHOULD CONSIDER SEEKING SAFE HARBOR. #end #if (${ctaSelected} == "YES") @@ -289,4 +343,12 @@ THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. $$ +############################################## +## Code to pull the user name into the product +############################################## +##${user} +################################################################## +## If you decide to pull the user name from a file use this coding +################################################################## +##parse("name.vm") !**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.xml index ab6f16af3c..fcc0142a30 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatement.xml @@ -1,6 +1,7 @@mi +mph + + ++ + + + + ++ + + +NEW +COR ++ + + +TO.W +true + + +true + + +30 ++ + +15 +20 +25 +30 +40 +45 +50 +60 ++ + + + + + + + + + ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.00 +AND +0 +COUNTYNAME + +NAME +STATE +countyTypes.txt +FIPS + +NAME ++ +parent ++ ++ ++ 25 ++ + +NAME +POINTS ++ ++ ++ 1 +50 ++ +distance +warngenlev ++ + +NAME +POINTS ++ ++ ++ 5 +100 ++ +distance ++ + +true +8.0 +5 +5 +4 +8 +Name +COUNTYNAME + +STATE +STATE +countyTypes.txt ++ +distance ++ ++ ++ + + +NAME +TRACK +true +20 +10 ++ ++ ++ + +warngenlev +population ++ + + +NAME +TRACK +true +10 +10 ++ +distance ++ ++ ++ + + + +City +County + +States +TIMEZONES +TIME_ZONE ++ nmi @@ -76,12 +77,14 @@+ + @@ -114,12 +117,14 @@ + + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.vm index 796b04ce31..624727dee2 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.vm @@ -158,7 +158,7 @@ $zonecombo THIS IS A TEST MESSAGE. ## #end AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report} ## -#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType,"THESE STORMS WERE LOCATED", "OVER", 4, "NM", true) +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "OVER", 4, "NM", true) #if($movementSpeed < 3 || ${stationary}) . NEARLY STATIONARY. #else diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.xml index ff0ac831b4..dc77ca6629 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/marineWeatherStatementAshfall.xml @@ -196,6 +196,11 @@ Name Name countyTypes.txt ++ + ++ @@ -207,6 +212,11 @@ distance true 20 20 ++ + ++ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml index 9e30398849..e485bf5935 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning.xml @@ -290,6 +290,7 @@ distance false +- true 8.0 @@ -303,12 +304,17 @@STATE STATE countyTypes.txt ++ + ++ distance + + NAME POINTS true @@ -320,11 +326,12 @@- + NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml index 80c74d4328..38f88b2d61 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup.xml @@ -317,6 +317,7 @@false +- true 8.0 @@ -324,18 +325,23 @@5 4 8 -Name +Name COUNTYNAME - +STATE STATE countyTypes.txt + distance + + ++ + + NAME POINTS true @@ -345,13 +351,14 @@warngenlev population -- +- -- + + ++ NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml index ec2ac68412..2f5716c271 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarningFollowup_Zones.xml @@ -3,6 +3,7 @@ Modified Evan Bookbinder 09-16-2011 OB11.0.8-8 Modified Phil Kurimski 09-23-2011 OB 11.0.8-8 Modified Phil Kurimski 01-26-2012 OB 12.1.1-1 + Modified Phil Kurimski 02-29-2012 OB 12.2.1-3 -->@@ -318,6 +319,7 @@ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.vm index 3377eafa60..8e8219a182 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.vm @@ -1,15 +1,17 @@ -################################################ -## SHORT TERM FORECAST ## -## CREATED BY PHIL KURIMSKI - WFO DTX ## -## VERSION AWIPS II 1.0 -- AUG 19 2011 OB11.8 ## -################################################ +################################################## +## SHORT TERM FORECAST ## +## CREATED BY PHIL KURIMSKI - WFO DTX ## +## VERSION AWIPS II 1.0 -- AUG 19 2011 OB11.8 ## +## EDITED BY MIKE DANGELO 2-27-2012 ## +## EDITED BY Phil Kurimski 3-01-2012 OB12.2.1-4 ## +################################################## ## ${WMOId} ${vtecOffice} 000000 ${BBBId} NOW${siteId} #if(${productClass}=="T") TEST...SHORT TERM FORECAST...TEST## #else -false +true 8.0 @@ -325,15 +327,20 @@5 4 8 -Name - +Name NAME +STATE STATE countyTypes.txt + distance + + ++ @@ -345,14 +352,15 @@ +- warngenlev population -- + +- -- + + ++ NAME POINTS @@ -371,8 +379,9 @@ ++ City diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml index 4ae5163c74..b0545a41b4 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/nonConvectiveFlashFloodWarning_Zones.xml @@ -3,7 +3,8 @@ + Modified Phil Kurimski 01-26-2012 OB 12.1.1-1 + Modified Phil Kurimski 02-29-2012 OB 12.2.1-3 -->mi @@ -289,6 +290,7 @@false +- true 8.0 @@ -305,25 +307,31 @@+ distance + + ++ + + NAME POINTS true 30 200 ++ + ++ - warngenlev population -- +- -- NAME POINTS diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.vm index 85733138c6..1dca9107f5 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.vm @@ -1,11 +1,12 @@ ################################################################ ## SEVERE THUNDERSTORM WARNING TEMPLATE ## ## CREATED BY EVAN BOOKBINDER - WFO EAX ## -## VERSION AWIPS II 1.0 -- 3-24-2011 INITIAL OB11.2 REWRITE ## +## VERSION HISTORY -- 3-24-2011 INITIAL OB11.2 REWRITE ## ## 4-12-2011 OB11.4 MODIFICATIONS ## ## 7-11-2011 OB11.7 MODIFICATIONS ## ## 9-15-2011 OB11.8.0-8 PATHCAST/CITY ## ## 11-04-2011 OB11.9-3 (DRs) ## +## 2-24-2012 OB12.2.1 CLEANUP ## ################################################################ ## ##SET SOME INITIAL VARIABLES @@ -276,7 +277,7 @@ THIS IS A TEST MESSAGE. ## #else * LOCATIONS IMPACTED INCLUDE... - !** YOU DID NOT SELECT A PATHCAST OR LIST OF CITIES BULLET. PLEASE ENTER LOCATIONS IMPACTED **!. + !** YOU DID NOT SELECT A PATHCAST OR LIST OF CITIES BULLET. PLEASE ENTER LOCATIONS IMPACTED OR REGENERATE THE WARNING WITH THE CORRECT LOCATIONS BULLET SELECTED **!. #end ## Uncomment below pull in mile marker info @@ -312,7 +313,7 @@ PRECAUTIONARY/PREPAREDNESS ACTIONS... #end ## #if(${list.contains($bullets, "torWatchRemainsInEffectCTA")}) -A TORNADO WATCH REMAINS IN EFFECT FOR THE WARNED AREA. ALTHOUGH NOT IMMEDIATELY LIKELY...IF A TORNADO IS SPOTTED... ACT QUICKLY AND MOVE TO A PLACE OF SAFETY IN A STURDY STRUCTURE...SUCH AS A BASEMENT OR SMALL INTERIOR ROOM. +A TORNADO WATCH REMAINS IN EFFECT FOR THE WARNED AREA. ALTHOUGH NOT IMMEDIATELY LIKELY...IF A TORNADO IS SPOTTED...ACT QUICKLY AND MOVE TO A PLACE OF SAFETY IN A STURDY STRUCTURE...SUCH AS A BASEMENT OR SMALL INTERIOR ROOM. #end ## @@ -373,10 +374,10 @@ THIS STORM HAS A HISTORY OF PRODUCING LARGE HAIL. SEEK SHELTER NOW INSIDE A STUR ## #if(${list.contains($bullets, "historyWindCTA")}) #if(${stormType} == "line") -THESE STORMS HAVE A HISTORY OF PRODUCING DESTRUCTIVE WINDS. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. +THESE STORMS HAVE A HISTORY OF PRODUCING WIND DAMAGE. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. #else -THIS STORM HAS A HISTORY OF PRODUCING DESTRUCTIVE WINDS. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. +THIS STORM HAS A HISTORY OF PRODUCING WIND DAMAGE. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. #end #end @@ -482,6 +483,7 @@ ${mathUtil.round(${movementInKnots})}KT ## ## ##${windhailTag} + $$ ############################################## diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml index daf8b8afce..e2a16626bf 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeThunderstormWarning.xml @@ -5,6 +5,7 @@ 4-13-2011 Merge in OB11.4 Coding Changes 9-17-2011 Merge in OB11.8.0-8 NEW XML SYNTAX CHANGES Mike Dangelo WFO CTP 9-22-2011 to add in remarks and lines which will allow Zone-based products (Alaska TIM) + Phil Kurimski WFO DTX 2-28-2012 to fix parse string issues -->@@ -74,9 +75,9 @@ \ No newline at end of file +- + - + @@ -110,7 +111,7 @@ - + @@ -129,9 +130,9 @@ - + - + @@ -164,8 +165,8 @@ - - + + @@ -277,6 +278,11 @@ true 20 10 ++ + ++ warngenlev population @@ -302,6 +308,10 @@+ + + - City diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.vm index 2d5176d342..c13b0f42ad 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.vm @@ -5,7 +5,8 @@ ## HEADLINE MACRO REWRITE 8-17-2011 OB11.8.4 ## ## PATHCAST/CITIES CHANGES 9-15-2011 OB11.8.0-8 ## ## BY PHIL KURIMSKI 9-22-2011 OB11.8.0-8 ## -## BY EVAN BOOKBINDER 11-04-2011 OB11.9-3 (DRs) ## +## BY EVAN BOOKBINDER 11-04-2011 OB11.9-3 ## +## BY EVAN BOOKBINDER 2-24-2012 OB12.2.1 ## ################################################################# ## ################################################################### @@ -503,21 +504,21 @@ ${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} ################################################################## #set ($hailwind = "") #if (${hailSize} < 1 && ${windSpeed} < 58) - #if (${phenomena}=="SV") - #set ($hailwind = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") - #set ($windhailTag = "WIND...HAIL <50MPH <.75IN") - #else - #set ($TORhailTag = "HAIL <.75IN") - #end +#if (${phenomena}=="SV") + #set ($hailwind = "!**YOU DID NOT SELECT ANY SEVERE WIND OR HAIL THREATS. PLEASE CLOSE THIS WINDOW AND RE-GENERATE THIS WARNING!**!") + #set ($windhailTag = "WIND...HAIL <50MPH <.75IN") +#else + #set ($TORhailTag = "HAIL <.75IN") +#end #elseif(${hailSize} > 0 && ${windSpeed} > 0) - #if (${hailSize} < 1) - #set ($hailwind = " ${reportAuthSVR} ${windThreat}") - #if(${phenomena}=="SV") - #set ($smallHail = "${hailThreat}${hailTrail} MAY ALSO ACCOMPANY THE DAMAGING WINDS.") - #end - #else - #set ($hailwind = " ${reportAuthSVR} ${hailLead}${hailThreat}${hailTrail} AND ${windThreat}") - #end +#if (${hailSize} < 1) + #set ($hailwind = " ${reportAuthSVR} ${windThreat}") +#if(${phenomena}=="SV") + #set ($smallHail = "${hailThreat}${hailTrail} MAY ALSO ACCOMPANY THE DAMAGING WINDS.") +#end +#else + #set ($hailwind = " ${reportAuthSVR} ${hailLead}${hailThreat}${hailTrail} AND ${windThreat}") +#end #set ($windhailTag = "WIND...HAIL ${windTag} ${hailTag}") #set ($TORhailTag = "HAIL ${hailTag}") #elseif(${hailSize} > 0) @@ -534,11 +535,11 @@ ${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} ######################################################## #set($TORHailThreat = "") #if (${hailSize} >= 1.5 && ${phenomena}=="TO") - #if(${stormType} == "line") +#if(${stormType} == "line") #set($TORHailThreat = "IN ADDITION TO TORNADOES...${hailLead}${hailThreat}${hailTrail} IS EXPECTED WITH THESE STORMS.") - #else +#else #set($TORHailThreat = "IN ADDITION TO A TORNADO...${hailLead}${hailThreat}${hailTrail} IS EXPECTED WITH THIS STORM.") - #end +#end #end ###################################################### ###### Storm current location description ########## @@ -672,6 +673,9 @@ IF A TORNADO OR OTHER SEVERE WEATHER IS SPOTTED...REPORT IT TO THE NATIONAL WEAT #if(${list.contains($bullets, "squallCTA")} && ${stormType} == "line") THIS LINE OF THUNDERSTORMS IS CAPABLE OF PRODUCING TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. DO NOT WAIT TO SEE OR HEAR THE TORNADO. FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF YOUR HOME OR BUSINESS. +#elseif(${list.contains($bullets, "squallCTA")}) +THIS CLUSTER OF THUNDERSTORMS IS CAPABLE OF PRODUCING TORNADOES AND WIDESPREAD SIGNIFICANT WIND DAMAGE. DO NOT WAIT TO SEE OR HEAR THE TORNADO. FOR YOUR PROTECTION MOVE TO AN INTERIOR ROOM ON THE LOWEST FLOOR OF YOUR HOME OR BUSINESS. + #end #if(${list.contains($bullets, "waterCTA")}) IF ON OR NEAR !**NAME OF WATER BODY **!...GET OUT OF THE WATER AND MOVE TO SAFE SHELTER IMMEDIATELY! IF YOU CAN HEAR THUNDER...YOU ARE CLOSE ENOUGH TO BE STRUCK BY LIGHTNING. IN ADDITION...SEVERE THUNDERSTORMS CAN PRODUCE LARGE CAPSIZING WAVES...EVEN ON SMALL BODIES OF WATER. MOVE INTO DOCK AND SEEK SAFE SHELTER NOW. DON'T BE CAUGHT ON THE WATER IN A THUNDERSTORM. @@ -679,7 +683,7 @@ IF ON OR NEAR !**NAME OF WATER BODY **!...GET OUT OF THE WATER AND MOVE TO SAFE #end ## #if(${list.contains($bullets, "torWatchRemainsInEffectCTA")}) -A TORNADO WATCH REMAINS IN EFFECT FOR THE WARNED AREA. ALTHOUGH NOT IMMEDIATELY LIKELY...IF A TORNADO IS SPOTTED... ACT QUICKLY AND MOVE TO A PLACE OF SAFETY IN A STURDY STRUCTURE...SUCH AS A BASEMENT OR SMALL INTERIOR ROOM. +A TORNADO WATCH REMAINS IN EFFECT FOR THE WARNED AREA. ALTHOUGH NOT IMMEDIATELY LIKELY...IF A TORNADO IS SPOTTED...ACT QUICKLY AND MOVE TO A PLACE OF SAFETY IN A STURDY STRUCTURE...SUCH AS A BASEMENT OR SMALL INTERIOR ROOM. #end ## @@ -740,10 +744,10 @@ THIS STORM HAS A HISTORY OF PRODUCING LARGE HAIL. SEEK SHELTER NOW INSIDE A STUR ## #if(${list.contains($bullets, "historyWindCTA")}) #if(${stormType} == "line") -THESE STORMS HAVE A HISTORY OF PRODUCING DESTRUCTIVE WINDS. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. +THESE STORMS HAVE A HISTORY OF PRODUCING WIND DAMAGE. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. #else -THIS STORM HAS A HISTORY OF PRODUCING DESTRUCTIVE WINDS. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. +THIS STORM HAS A HISTORY OF PRODUCING WIND DAMAGE. THIS IS A VERY DANGEROUS SITUATION. SEEK SHELTER NOW INSIDE A STURDY STRUCTURE AND STAY AWAY FROM WINDOWS. #end #end @@ -853,10 +857,10 @@ $$ ############################################## #### END CONTINUATION SECTON ################# ############################################## - +#end ############################################## ## Code to pull the user name into the product ############################################## ##${user} + !**NAME/INITIALS**! -#end \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml index 47febeeb4d..57c3614fd7 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/severeWeatherStatement.xml @@ -4,6 +4,7 @@ 9-15-2011 - OB11.8.0-8 NEW XML SYNTAX CHANGES Mike Dangelo WFO CTP 9-22-2011 to add in remarks and lines which will allow Zone-based products (Alaska TIM) EVAN BOOKBINDER WFO EAX 11-4-2011 removed bulletDefaults that prevented auto selection + EVAN BOOKBINDER WFO EAX 2-24-2012 corrected parseString errors that prevented auto selection --> -- + + - + - + @@ -259,13 +260,13 @@ - + - + - - + + @@ -285,13 +286,13 @@ - + - - - - - + + + + + - - + + + - + - + @@ -369,19 +370,19 @@ - + - + - + - - + + @@ -492,6 +493,11 @@ true 20 10 ++ + ++ warngenlev population @@ -527,4 +533,4 @@ and place into this templateTIMEZONES TIME_ZONE SHORT TERM FORECAST ## +SHORT TERM FORECAST## #end NATIONAL WEATHER SERVICE ${officeShort} @@ -32,98 +34,111 @@ ${dateUtil.format(${now}, ${timeFormat.header}, ${localtimezone})} #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end - -.NOW... - ####################################################################### ## List of Event Types. ####################################################################### #set ($eventType = "A THUNDERSTORM") -#set ($pathcastLead = "THIS STORM") +#set ($pathcastLead = "THIS STORM WILL BE NEAR...") #set ($otherLead = ${pathcastLead}) -#if(${list.contains($bullets, "event1")}) - #if(${stormType} == "line") - #set ($eventType = "A LINE OF THUNDERSTORMS") - #set ($pathheader = "THESE STORMS WILL BE NEAR...") - #set ($pathcastLead = "THESE STORMS WILL BE NEAR...") - #set ($otherLead = "THESE STORMS") - #else - #set ($eventType = "A THUNDERSTORM") - #set ($pathheader = "THIS STORM WILL BE NEAR...") - #set ($pathcastLead = "THIS STORM WILL BE NEAR...") - #set ($otherLead = "THIS STORM") - #end +#if(${list.contains($bullets, "thunderstorm")}) +#if(${stormType} == "line") + #set ($eventType = "A LINE OF THUNDERSTORMS") + #set ($pathcastLead = "THESE STORMS WILL BE NEAR...") + #set ($otherLead = "THESE STORMS") + #set ($reportType2 = "${otherLead} WERE") +#else + #set ($eventType = "A THUNDERSTORM") + #set ($pathcastLead = "THIS STORM WILL BE NEAR...") + #set ($otherLead = "THIS STORM") + #set ($reportType2 = "${otherLead} WAS") +#end #end #if(${list.contains($bullets, "rainShower")}) - #if(${stormType} == "line") - #set ($eventType = "A LINE OF SHOWERS") - #set ($pathcastLead = "THESE SHOWERS WILL BE NEAR...") - #set ($otherLead = "THESE SHOWERS") - #else - #set ($eventType = "A SHOWER") - #set ($pathcastLead = "THIS SHOWER WILL BE NEAR...") - #set ($otherLead = "THIS SHOWER") - #end +#if(${stormType} == "line") + #set ($eventType = "A LINE OF SHOWERS") + #set ($pathcastLead = "THESE SHOWERS WILL BE NEAR...") + #set ($otherLead = "THESE SHOWERS") + #set ($reportType2 = "${otherLead} WERE") +#else + #set ($eventType = "A SHOWER") + #set ($pathcastLead = "THIS SHOWER WILL BE NEAR...") + #set ($otherLead = "THIS SHOWER") + #set ($reportType2 = "${otherLead} WAS") +#end #end #if(${list.contains($bullets, "snowShower")}) - #if(${stormType} == "line") - #set ($eventType = "A LINE OF SNOW SHOWERS") - #set ($pathcastLead = "THESE SNOW SHOWERS WILL BE NEAR...") - #set ($otherLead = "THESE SNOW SHOWERS") - #else - #set ($eventType = "A SNOW SHOWER") - #set ($pathcastLead = "THIS SNOW SHOWER WILL BE NEAR...") - #set ($otherLead = "THIS SNOW SHOWER") - #end +#if(${stormType} == "line") + #set ($eventType = "A LINE OF SNOW SHOWERS") + #set ($pathcastLead = "THESE SNOW SHOWERS WILL BE NEAR...") + #set ($otherLead = "THESE SNOW SHOWERS") + #set ($reportType2 = "${otherLead} WERE") +#else + #set ($eventType = "A SNOW SHOWER") + #set ($pathcastLead = "THIS SNOW SHOWER WILL BE NEAR...") + #set ($otherLead = "THIS SNOW SHOWER") + #set ($reportType2 = "${otherLead} WAS") +#end #end #if(${list.contains($bullets, "snowSquall")}) #set ($eventType = "A SNOW SQUALL") #set ($pathcastLead = "THE SNOW SQUALLS WILL BE NEAR...") #set ($otherLead = "THE SNOW SQUALLS") + #set ($reportType2 = "${otherLead} WERE") #end #if(${list.contains($bullets, "leadingRain")}) #set ($eventType = "THE LEADING EDGE OF AN AREA OF RAIN") #set ($pathcastLead = "THE RAIN WILL BEGIN AT...") #set ($otherLead = "THE RAIN") + #set ($reportType2 = "${otherLead} WAS") #end #if(${list.contains($bullets, "leadingSnow")}) #set ($eventType = "THE LEADING EDGE OF AN AREA OF SNOW") #set ($pathcastLead = "THE SNOW WILL BEGIN AT...") #set ($otherLead = "THE SNOW") + #set ($reportType2 = "${otherLead} WAS") #end #if(${list.contains($bullets, "backedgeRain")}) #set ($eventType = "THE BACK EDGE OF AN AREA OF RAIN") #set ($pathcastLead = "THE RAIN WILL END AT...") #set ($otherLead = "THE RAIN") + #set ($reportType2 = "${otherLead} WAS") #end #if(${list.contains($bullets, "backedgeSnow")}) #set ($eventType = "THE BACK EDGE OF AN AREA OF SNOW") #set ($pathcastLead = "THE SNOW WILL END AT...") #set ($otherLead = "THE SNOW") + #set ($reportType2 = "${otherLead} WAS") #end #if(${list.contains($bullets, "showerThunderstorm")}) - #if(${stormType} == "line") - #set ($eventType = "A LINE OF SHOWERS AND THUNDERSTORMS") - #set ($pathheader = "THESE STORMS WILL BE NEAR...") - #set ($pathcastLead = "THESE STORMS WILL BE NEAR...") - #set ($otherLead = "THESE STORMS") - #else - #set ($eventType = "SHOWERS AND THUNDERSTORMS") - #set ($pathheader = "THIS STORMS WILL BE NEAR...") - #set ($pathcastLead = "THIS STORM WILL BE NEAR...") - #set ($otherLead = "THIS STORM") - #end +#if(${stormType} == "line") + #set ($eventType = "A LINE OF SHOWERS AND THUNDERSTORMS") + #set ($pathcastLead = "THESE STORMS WILL BE NEAR...") + #set ($otherLead = "THESE STORMS") + #set ($reportType2 = "${otherLead} WERE") +#else + #set ($eventType = "SHOWERS AND THUNDERSTORMS") + #set ($pathcastLead = "THIS STORM WILL BE NEAR...") + #set ($otherLead = "THIS STORM") + #set ($reportType2 = "${otherLead} WAS") #end -#if(${list.contains($bullets, "front")}) - #set ($eventType = "A FRONT") - #set ($pathcastLead = "THE FRONT WILL BE NEAR...") - #set ($otherLead = "THE FRONT") +#end +#if(${list.contains($bullets, "gFront")}) + #set ($eventType = "A GUST FRONT") + #set ($pathcastLead = "THE GUST FRONT WILL BE NEAR...") + #set ($otherLead = "THE GUST FRONT") + #set ($reportType2 = "${otherLead} WAS") +#end +#if(${list.contains($bullets, "cFront")}) + #set ($eventType = "A COLD FRONT") + #set ($pathcastLead = "THE COLD FRONT WILL BE NEAR...") + #set ($otherLead = "THE COLD FRONT") + #set ($reportType2 = "${otherLead} WAS") #end ####################################################################### ## Basis section that incorporates line phenomena...capable vs producing ## and based on selections above. ####################################################################### -#set ($report = "!** YOU DIDN'T SELECT A REPORTER **! ${eventType}") +#set ($report = "!** YOU DIDN'T SELECT A BASIS **! ${eventType}") #if(${list.contains($bullets, "doppler")}) #set ($report = "NATIONAL WEATHER SERVICE DOPPLER RADAR INDICATED ${eventType}...") #end @@ -142,13 +157,13 @@ THIS IS A TEST MESSAGE. ## ###################################################### ###### Storm current location description ########## ###################################################### - -AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}... ${report} ## -#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType,"LOCATED", "NEAR", 4, "MILES", true) +.NOW... +AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report}## +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 4, "MILES", true) #if($movementSpeed < 3 || ${stationary}) -NEARLY STATIONARY. +. ${reportType2} NEARLY STATIONARY. #else -MOVING #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. + MOVING #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. #end #if(${productClass}=="T") @@ -158,36 +173,41 @@ THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE. ################################################# ## Set Pathcast ################################################# -##set ($pathcastLead = "${phenomena}") #if(${list.contains($bullets, "pathcast")}) +* ## #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end -## This pathcast coding will give you other locations include -##pathCast(${pathcastLead} ${otherLead} ${pathCast} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) -## This pathcast coding will only give you a pathcast by setting otherPoints to zero -#pathCast(${pathcastLead} ${otherLead} ${pathCast} 0 ${areas} ${dateUtil} ${timeFormat} 0) +#pathCast("${pathcastLead}" ${otherLead} ${pathCast} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) #elseif(${list.contains($bullets, "listofcities")}) +* ## #if(${productClass}=="T") THIS IS A TEST MESSAGE. ## #end #### THE THIRD ARGUMENT IS A NUMBER SPECIFYING THE NUMBER OF COLUMNS TO OUTPUT THE CITIES LIST IN #### 0 IS A ... SEPARATED LIST, 1 IS ONE PER LINE, >1 IS A COLUMN FORMAT -#locationsList("LOCATIONS IMPACTED INCLUDE..." ${otherLead} 0 ${otherPoints} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) +#### IF YOU USE SOMETHING OTHER THAN "LOCATIONS IMPACTED INCLUDE" LEAD IN BELOW, MAKE SURE THE +#### ACCOMPANYING XML FILE PARSE STRING IS CHANGED TO MATCH! +#locationsList("LOCATIONS IMPACTED INCLUDE..." ${otherLead} 0 ${cityList} ${otherPoints} ${areas} ${dateUtil} ${timeFormat} 0) + +#else +* LOCATIONS IMPACTED INCLUDE... + !** YOU DID NOT SELECT A PATHCAST OR LIST OF CITIES BULLET. PLEASE ENTER LOCATIONS IMPACTED OR REGENERATE THE WARNING WITH THE CORRECT LOCATIONS BULLET SELECTED **!. + +#end + +#if(${list.contains($bullets, "gustFrontWinds")}) +GUSTY WINDS TO !**WIND SPEED**! MPH WILL ACCOMPANY THE FRONT. + +#end +#if(${list.contains($bullets, "frontalPassage")}) +WINDS BEHIND THE COLD FRONT WILL SUDDENLY SHIFT TO THE !** DIRECTION **! AND INCREASE TO !** SPEED **! MPH. #end #if(${list.contains($bullets, "heavySnow")}) HEAVY FALLING AND BLOWING SNOW WILL CREATE NEAR ZERO VISIBILITY. -#end -#if(${list.contains($bullets, "gustyWinds")}) -GUSTY WINDS TO !**WIND SPEED**! MPH WILL ACCOMPANY THE GUST FRONT. - -#end -#if(${list.contains($bullets, "frontPass")}) -WINDS BEHIND THE FRONT WILL SHIFT SUDDENLY TO THE !** DIRECTION **! AND INCREASE TO !** SPEED **! MPH. - #end #if(${list.contains($bullets, "snowAmt")}) LOCATIONS CAN EXPECT !** EXPECTED SNOW **! INCHES OF SNOW. @@ -200,15 +220,17 @@ LOCATIONS CAN EXPECT !** EXPECTED SNOW **! INCHES OF SNOW. ############# ## WATCHES ## ############# -#if(${list.contains($includedWatches, "torWatches")}) +#if(${list.contains($includedWatches, "torWatches")} && ${list.contains($bullets, "includeTorWatches")}) #inserttorwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat}) + #end -#if(${list.contains($includedWatches, "svrWatches")}) +#if(${list.contains($includedWatches, "svrWatches")} && ${list.contains($bullets, "includeSvrWatches")}) #insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat}) + #end ###printcoords(${areaPoly}, ${list}) $$ -!**NAME/INITIALS**! \ No newline at end of file +!**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml index dd42c9eda7..88edc1bde3 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/shortTermForecast.xml @@ -1,6 +1,7 @@ +@@ -56,35 +57,34 @@ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.vm index c024361096..7adc6a1039 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.vm @@ -3,6 +3,8 @@ ## WRITTEN BY: ## ## TOM BIRCHARD WFO HFO/EVAN BOOKBINDER WFO EAX ## ## VERSION 1.0 8-16-2011 ## +## Edited by Mike Dangelo 02-27-2012 ## +## Edited by Phil Kurimski 3-01-2012 OB12.2.1-4 ## ###################################################### ## ##SET SOME INITIAL VARIABLES @@ -131,7 +133,7 @@ THIS IS A TEST MESSAGE. ## THIS IS A TEST MESSAGE. ## #end AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}...${report} ## -#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES") +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES", true) #if($movementSpeed < 3 || ${stationary}) . ${reportType2} NEARLY STATIONARY. ${smallHail} #else @@ -272,7 +274,7 @@ FREQUENT CLOUD TO GROUND LIGHTNING IS OCCURRING WITH THIS STORM. LIGHTNING CAN S #end ## -#if(${list.contains($bullets, "stormIntensify")}) +#if(${list.contains($bullets, "stormIntensifyCTA")}) #if(${stormType} == "line") THESE STORMS MAY INTENSIFY...SO BE CERTAIN TO MONITOR LOCAL RADIO AND TV STATIONS...AS WELL AS LOCAL CABLE TV OUTLETS...FOR ADDITIONAL INFORMATION AND POSSIBLE WARNINGS FROM THE NATIONAL WEATHER SERVICE. @@ -325,6 +327,7 @@ ${mathUtil.round(${movementInKnots})}KT ## #llFormat(${eventCoord.y}) #llFormat(${eventCoord.x}) ## #end + $$ -!**NAME/INITIALS**! \ No newline at end of file +!**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml index 55b2e7d691..398ca991df 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/significantWeatherAdvisory.xml @@ -3,6 +3,8 @@ EVAN BOOKBINDER WFO EAX 3-23-2011 Initial creation 4-13-2011 Merge in OB11.4 Coding Changes 9-15-2011 Merge in OB11.8.0-8 Coding Changes, Zone Codes + Mike Dangelo 02-27-2012 minor tweaks + Phil Kurimski 3-01-2012 -->- - - - - + + + + + - - - - - - - - - - + + + + + + + + + + + - - + + - - - + + + - @@ -98,29 +98,28 @@ @@ -131,8 +130,6 @@ - -- - - - - - - - - - + + + + + + + + + + + - - + + + + - - - - + - 0.00 AND @@ -156,18 +153,23 @@25 + + NAME TRACK true -50 +10 10 - +warngenlev -population +distance + + ++ + + NAME POINTS @@ -199,6 +201,23 @@warngenlev + -NAME +TRACK +true +20 +10 ++ ++ ++ + +warngenlev +population +NAME + +NAME -->STATE STATE countyTypes.txt - +distance +population + + ++ @@ -231,4 +255,6 @@ and place into this template + +TIMEZONES TIME_ZONE @@ -20,7 +22,9 @@ - +NEW +COR +@@ -78,7 +82,7 @@ - + NAME STATE STATE @@ -193,6 +198,11 @@+ distance + + ++ @@ -201,6 +211,11 @@ true 20 10 ++ + ++ warngenlev population diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.vm index 235817e741..c5e9d4286e 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.vm @@ -7,7 +7,8 @@ ## VERSION AWIPS II 1.3 -- SEP 23 2011 OB11.8 ## ## Added Volcano Information for version 1.3 ## ## VERSION AWIPS II 1.4 -- JAN 26 2012 OB12.1.1-1 ## -## Cleaned up wind coding for version 1.4 ## +## Cleaned up wind coding for version 1.4 ## +## VERSION AWIPS II 1.5 -- MAR 2 2012 OB12.2.1-4 ## ##################################################### ## Added Volcano Information in version 1.3 for sites where ## Volcanoes affect their marine zones. If sites wish to hide @@ -217,9 +218,13 @@ THIS IS A TEST MESSAGE. ## ####################################################################### #set($stormline = "A ${eventType}") #set($pathheader = "THE ${eventType}") +#set($specialEvent = "THIS ${eventType}") +#set($reportType2 = "THE ${eventType} WAS") #if(${stormType} == "line") #set($stormline = "A LINE OF ${eventType}S") #set($pathheader = "${eventType}S") + #set($specialEvent = "THESE ${eventType}S") + #set($reportType2 = "THE ${eventType}S WERE") #end ####################################################################### ## Corrective coding to prevent the use of "Line of Fronts" in the Product. @@ -227,6 +232,8 @@ THIS IS A TEST MESSAGE. ## #if(${eventType} == "FRONT") #set($stormline = "A ${eventType}") #set($pathheader = "THE ${eventType}") + #set($specialEvent = "THIS ${eventType}") + #set($reportType2 = "THE ${eventType} WAS") ## #set($stormType = "") #end ####################################################################### @@ -236,6 +243,8 @@ THIS IS A TEST MESSAGE. ## #if(${eventType} == "VOLCANO") #set($stormline = "AN ERUPTION OF !** NAME OF VOLCANO**! VOLCANO") #set($pathheader = "THE ${volcanoPath}") + #set($reportType2 = "THE ${volcanoPath} WAS") + #set($specialEvent = "THE ${volcanoPath}") ## #set($stormType = "") #set($impacted = "LOCATIONS IMPACTED BY ${volcanoPath} INCLUDE...") #end @@ -317,13 +326,8 @@ THIS IS A TEST MESSAGE. ## ############################################## #if(${list.contains($bullets, "specialEvent")}) -#if(${stormType} == "line") -THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THESE STORMS AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF ${specialEvent} AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. -#else -THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THIS STORM AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. - -#end #end ##################### ## CALL TO ACTIONS ## @@ -403,4 +407,12 @@ ${mathUtil.round(${movementInKnots})}KT ## $$ +############################################## +## Code to pull the user name into the product +############################################## +##${user} +################################################################## +## If you decide to pull the user name from a file use this coding +################################################################## +##parse("name.vm") !**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.xml index 9e75dc3481..146bd83ef5 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarning.xml @@ -3,6 +3,7 @@ @@ -102,14 +103,14 @@ Added Volcano Information Phil Kurimski 23 Sept 2011- + - + - + @@ -152,14 +153,14 @@ Added Volcano Information Phil Kurimski 23 Sept 2011 - + - + - + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.vm index 023b73108d..9b712b286a 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.vm @@ -7,7 +7,8 @@ ## VERSION AWIPS II 1.3 -- SEP 22 2011 OB11.8 ## ## Added Volcano Information for version 1.3 ## ## VERSION AWIPS II 1.4 -- JAN 26 2012 OB12.1.1-1 ## -## Cleaned up wind coding for version 1.4 ## +## Cleaned up wind coding for version 1.4 ## +## VERSION AWIPS II 1.5 -- MAR 2 2012 OB12.2.1-4 ## ##################################################### ## Added Volcano Information in version 1.3 for sites where ## Volcanoes affect their marine zones. If sites wish to hide @@ -281,9 +282,13 @@ ${canwarning} ####################################################################### #set($stormline = "A ${eventType}") #set($pathheader = "THE ${eventType}") +#set($specialEvent = "THIS ${eventType}") +#set($reportType2 = "THE ${eventType} WAS") #if(${stormType} == "line") #set($stormline = "A LINE OF ${eventType}S") #set($pathheader = "${eventType}S") + #set($specialEvent = "THESE ${eventType}S") + #set($reportType2 = "THE ${eventType}S WERE") #end ####################################################################### ## Corrective coding to prevent the use of "Line of Fronts" in the Product @@ -291,7 +296,9 @@ ${canwarning} #if(${eventType} == "FRONT") #set($stormline = "A ${eventType}") #set($pathheader = "THE ${eventType}") + #set($specialEvent = "THIS ${eventType}") #set($stormType = "") + #set($reportType2 = "THE ${eventType} WAS") #end ####################################################################### ## Coding for volcanos...this will override all other selections. @@ -300,6 +307,8 @@ ${canwarning} #if(${eventType} == "VOLCANO") #set($stormline = "AN ERUPTION OF !** NAME OF VOLCANO**! VOLCANO") #set($pathheader = "THE ${volcanoPath}") + #set($specialEvent = "THE ${volcanoPath}") + #set($reportType2 = "THE ${volcanoPath} WAS") #set($stormType = "") #set($impacted = "LOCATIONS IMPACTED BY ${volcanoPath} INCLUDE...") #end @@ -399,13 +408,8 @@ THIS IS A TEST MESSAGE. ## ############################################## #if(${list.contains($bullets, "specialEvent")}) -#if(${stormType} == "line") -THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THESE STORMS AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. +EVERYONE AT !**event/venue name or location**! ARE IN THE PATH OF ${specialEvent} AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. -#else -THOSE ATTENDING THE !**event/venue name or location**! ARE IN THE PATH OF THIS STORM AND SHOULD PREPARE FOR IMMINENT DANGEROUS WEATHER CONDITIONS. SEEK SHELTER NOW. - -#end #end ##################### ## CALL TO ACTIONS ## @@ -771,7 +775,7 @@ ${area.name}... THIS IS A TEST MESSAGE. ## #end AT ${dateUtil.format(${event}, ${timeFormat.clock}, ${localtimezone})}... ${report} LOCATED ## -#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "OVER", 4, "NM") +#handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "OVER", 4, "NM", true) #if(${eventType} == "VOLCANO") . #elseif($movementSpeed < 3 || ${stationary}) @@ -990,4 +994,12 @@ ${mathUtil.round(${movementInKnots})}KT ## $$ +############################################## +## Code to pull the user name into the product +############################################## +##${user} +################################################################## +## If you decide to pull the user name from a file use this coding +################################################################## +##parse("name.vm") !**NAME/INITIALS**! diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.xml index adb0b4c4cf..3e77b0d98e 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialMarineWarningFollowup.xml @@ -3,6 +3,7 @@ @@ -84,7 +85,7 @@ Added Volcano Information Phil Kurimski 23 Sept 2011 - + @@ -102,7 +103,7 @@ Added Volcano Information Phil Kurimski 23 Sept 2011 - + @@ -137,14 +138,14 @@ Added Volcano Information Phil Kurimski 23 Sept 2011 - + - + - + @@ -188,14 +189,14 @@ Added Volcano Information Phil Kurimski 23 Sept 2011 - + - + - + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml index a50bb45b96..a9500f8f79 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/specialWeatherStatement.xml @@ -92,11 +92,11 @@ 25 -+ + NAME TRACK true -50 +20 10 warngenlev @@ -104,6 +104,22 @@+ + @@ -117,13 +133,19 @@ and place into this templateNAME +TRACK +true +10 +10 ++ +distance ++ ++ ++ 4 8 Name -NAME +NAME --> +STATE STATE countyTypes.txt + distance + + ++ diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/stormReports.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/stormReports.vm new file mode 100644 index 0000000000..aeb2aa9d93 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/stormReports.vm @@ -0,0 +1,26 @@ +#* +CREATED 2-29-2012 BY EVAN BOOKBINDER + +dbTable list should include the pointSource objects created in +stormReports.xml + +*# + +##set ($dbTable = [${lsr_severe},${lsr_flood}]) +#set ($dbTable = [${lsr_severe}]) +#if ($dbTable) +#foreach($table in $dbTable) +#set($size = ${list.size($table)}) +#if ($size > 1) +!** RECENT LOCAL STORM REPORTS: +(COPY AND PASTE VALID REPORTS INTO 3RD BULLET THEN DELETE THIS SECTION) +#foreach($report in $table) +${report.name} +#end +**! + + +#end + +#end +#end \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/stormReports.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/stormReports.xml new file mode 100644 index 0000000000..ea8a86ebcc --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/stormReports.xml @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.vm b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.vm index 082e35596a..3319ca85b2 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.vm +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.vm @@ -9,6 +9,7 @@ ## 9-16-11 - OB11.8.0-8 Pathcast/City ## ## MIKE DANGELO WFO CTP 9-22-11 - OB11.8.0-9 ## ## EVAN BOOKBINDER WFO EAX 11-04-11 - OB11.9-3 (DRs) ## +## EVAN BOOKBINDER WFO EAX 2-24-12 - OB12.2.1 ## ############################################################################### ## ESTABLISH SOME INITIAL VARIABLES #set($preAmble = "") @@ -196,7 +197,7 @@ THIS IS A TEST MESSAGE. ## #set ($preAmble = "TO REPEAT...A TORNADO HAS BEEN CONFIRMED BY LOCAL LAW ENFORCEMENT.") #end #if(${list.contains($bullets, "emergencyManagement")}) - #set ($reportType = "EMERGENCY MANAGEMENT OFFICIALS REPORTED A TORNADO") + #set ($reportType = "EMERGENCY MANAGEMENT REPORTED A TORNADO") #if(${stormType} == "line") #set ($pathcastLead = "THESE TORNADIC STORMS") #set ($moveLead = " DOPPLER RADAR SHOWED THESE TORNADIC STORMS MOVING") @@ -242,11 +243,11 @@ THIS IS A TEST MESSAGE. ## #thirdBullet(${dateUtil},${event},${timeFormat},${localtimezone},${secondtimezone})...${reportType} ## #handleClosestPoints($list, $closestPoints, $otherClosestPoints, $stormType, "NEAR", 6, "MILES", true) #if($movementSpeed < 3 || ${stationary}) - #if(${stormType} == "line") +#if(${stormType} == "line") . THE LINE OF TORNADIC STORMS WAS NEARLY STATIONARY. - #else +#else . THE TORNADIC STORM WAS NEARLY STATIONARY. - #end +#end #else .${moveLead} #direction(${movementDirectionRounded}) AT ${mathUtil.roundTo5(${movementSpeed})} MPH. #end diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml index 3f6eef0a7a..99ea8b582f 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/warngen/tornadoWarning.xml @@ -5,6 +5,7 @@ 4-13-2011 Merge in OB11.4 Coding Changes 9-15-2011 Merge in OB11.8.0-8 NEW XML SYNTAX CHANGES Mike Dangelo WFO CTP 9-22-2011 to add in remarks and lines which will allow Zone-based products (Alaska TIM) + EVAN BOOKBINDER WFO EAX 2-24-2012 corrected parseString errors that prevented auto selection --> @@ -62,11 +63,11 @@ - - - - - + + + + + - + + - - - dhr @@ -32,26 +34,6 @@- - - - - -java.lang.Throwable -- - - - -- - - - @@ -62,8 +44,8 @@+ \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrMessage.java b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrMessage.java deleted file mode 100644 index 349417268c..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrMessage.java +++ /dev/null @@ -1,102 +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.uf.edex.ohd.pproc; - -import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; - -/** - * A class that describes a DHR radar record that needs to be ingested. - * - * - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Mar 09, 2012 dgilling Initial creation - * - *- * - * @author dgilling - * @version 1.0 - */ - -@DynamicSerialize -public class HPEDhrMessage { - - @DynamicSerializeElement - private byte[] data; - - @DynamicSerializeElement - private String radarId; - - @DynamicSerializeElement - private String dtype; - - @DynamicSerializeElement - private String dt; - - public byte[] getData() { - return data; - } - - /** - * For use by Thrift serialization/deserialization only. Do not use. - */ - public HPEDhrMessage() { - - } - - public HPEDhrMessage(byte[] data, String radid, String dtype, String dt) { - this.data = data; - this.radarId = radid; - this.dtype = dtype; - this.dt = dt; - } - - public void setData(byte[] data) { - this.data = data; - } - - public String getRadarId() { - return radarId; - } - - public void setRadarId(String radarId) { - this.radarId = radarId; - } - - public String getDtype() { - return dtype; - } - - public void setDtype(String dtype) { - this.dtype = dtype; - } - - public String getDt() { - return dt; - } - - public void setDt(String dt) { - this.dt = dt; - } -} diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java index 535c0f2637..551488a32b 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java +++ b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/HPEDhrSrv.java @@ -30,14 +30,11 @@ import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import com.raytheon.uf.common.ohd.AppsDefaults; -import com.raytheon.uf.common.serialization.SerializationException; -import com.raytheon.uf.common.serialization.SerializationUtil; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.util.FileUtil; -import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.core.EdexException; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; @@ -51,8 +48,6 @@ import com.raytheon.uf.edex.ohd.MainMethod; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 20, 2010 4200 snaples Initial creation - * Mar 09, 2012 417 dgilling Refactor to use two-stage queue - * process. *HPEDhrMessage
describing the DHR radar file to - * be ingested. - */ - public void process(HPEDhrMessage message) { - // logger.info("Starting HPE process message."); - try { - writeFile(message); - } catch (FileNotFoundException e) { - logger.handle(Priority.PROBLEM, "HPE cannot create output file.", e); - return; - } catch (IOException e) { - logger.handle(Priority.PROBLEM, - "HPE Error writing updated contents of HPE file", e); - return; - } - runGatherScripts(); - } - - /** - * DPA radar files have been known to contain extra bytes at the beginning - * of the file. These bytes will cause the DHR decoder to fail. - *- * This method removes the leading bytes to ensure proper decoding of DHR - * files. - * - * @param message - * A
HPEDhrMessage
describing the DHR radar file to - * be ingested. - * @throws FileNotFoundException - * If the output file cannot be created or opened for any - * reason. - * @throws IOException - * If an I/O error occurs while writing the file. - */ - private void writeFile(HPEDhrMessage message) throws FileNotFoundException, - IOException { - String dtype = message.getDtype(); - String outname = dtype + message.getRadarId() + "." + message.getDt(); - String outPath; - if (dtype.equals(DHR)) { - outPath = appsDefaults.getToken("dhr_prod_dir"); - } else { - outPath = appsDefaults.getToken("dsp_prod_dir"); - } - File oP = new File(outPath); - if (!oP.exists()) { - oP.mkdirs(); - } - - byte[] fileContents = message.getData(); - int offset = findStartRadarData(new String(fileContents, 0, 80)); - String outFile = FileUtil.join(outPath, outname); - BufferedOutputStream outStream = null; - - try { - outStream = new BufferedOutputStream(new FileOutputStream(outFile)); - // logger.info("HPE Writing contents of file to " + - // outFile); - outStream.write(fileContents, offset, fileContents.length - offset); - } finally { - if (outStream != null) { - outStream.close(); - } - } - } - - /** - * Route endpoint for "dhrIngestFilter". Reads the given file to memory and - * determines whether or not this file is a DHR radar file. If it is, a - * message is sent to a JMS queue so it is later ingested. - * - * @param hpeFile - * The radar file to check. - */ - public void filter(File hpeFile) { + public Object process(File hpeFile) throws EdexException { // logger.info("Starting HPE Check message."); - byte[] fileContents = new byte[0]; - try { - fileContents = readHpeFile(hpeFile); - } catch (FileNotFoundException e) { - logger.handle(Priority.PROBLEM, - "HPE Cannot find file: " + hpeFile.toString(), e); - } catch (IOException e) { - logger.handle(Priority.PROBLEM, "HPE Error reading file: " - + hpeFile.toString(), e); - } + checkMessage(hpeFile); - if (fileContents.length < 80) { + return null; + } + + /** + * + * @param dhrFile + * The radar server message + * @throws EdexException + * If IOExceptions occur + */ + private void checkMessage(File hpeFile) throws EdexException { + + boolean proc = false; + // logger.info("Starting HPE CheckFile. "); + proc = checkFile(hpeFile); + if (proc == false) { return; } - - // check header - String fileStartStr = new String(fileContents, 0, 80); - // array will hold radar id, dtype, and dt information. using array so - // its contents can be modified by the checkFile() method. - String[] fileMetadata = new String[3]; - boolean validFile = checkFile(hpeFile.getName(), fileStartStr, - fileMetadata); - - // write file to queue - if (validFile) { - try { - sendFileToQueue(fileContents, fileMetadata[RADID_IDX], - fileMetadata[DTYPE_IDX], fileMetadata[DT_IDX]); - } catch (SerializationException e) { - logger.handle(Priority.PROBLEM, - "HPE can't serialize HPEDhrMessage for file: " - + hpeFile.toString(), e); - } catch (EdexException e) { - logger.handle(Priority.PROBLEM, - "HPE can't send message to QPID queue for file: " - + hpeFile.toString(), e); - } - } - // logger.info("Finished HPE CheckFile. "); - } - - /** - * Reads the given radar file to memory for later processing by the - *filter
function. - * - * @param hpeFile - * The file to read. - * @return The contents of the file. - * @throws FileNotFoundException - * If the specified file does not exist or cannot be opened. - * @throws IOException - * If an I/O error occurs while reading the file. - */ - private byte[] readHpeFile(File hpeFile) throws FileNotFoundException, - IOException { - BufferedInputStream inStream = null; - byte[] fileContents = null; - - try { - inStream = new BufferedInputStream(new FileInputStream(hpeFile)); - fileContents = new byte[(int) hpeFile.length()]; - inStream.read(fileContents); - } finally { - if (inStream != null) { - inStream.close(); - } - } - - return fileContents; - } - - /** - * Takes the given parameters and constructs aHPEDhrMessage
to - * be placed onto the queue used byHPEDhrSrv
for actual data - * processing. - * - * @param data - * The contents of the radar file. - * @param radid - * The radar id for the given file. - * @param dtype - * The file's dtype. - * @param dt - * The file's dt. - * @throws SerializationException - * If the constructedHPEDhrMessage
cannot be - * serialized by Thrift. - * @throws EdexException - * If the message cannot be placed onto the QPID queue for DHR - * data processing. - */ - private void sendFileToQueue(byte[] data, String radid, String dtype, - String dt) throws SerializationException, EdexException { - HPEDhrMessage message = new HPEDhrMessage(data, radid, dtype, dt); - byte[] messageData = SerializationUtil.transformToThrift(message); - EDEXUtil.getMessageProducer().sendAsyncUri(JMS_QUEUE_URI, messageData); - } - - /** - * Runs the DSPgather and DHRgather data processing scripts. - */ - private void runGatherScripts() { // logger.info("Starting HPE DSP gather."); int exitValue = MainMethod.runProgram("ksh", appsDefaults.getToken("pproc_bin") + "/DSPgather"); @@ -303,55 +135,86 @@ public class HPEDhrSrv { } /** - * Given a radar file name and file header, this function determines whether - * or not this file is a DHR radar file. + * DPA radar files have been known to contain extra bytes at the beginning + * of the file. These bytes will cause the DHR decoder to fail. + *+ * This method removes the leading bytes to ensure proper decoding of DHR + * files * * @param fileName - * The name of the radar file - * @param fileHeader - * The first 80 bytes from the radar file. - * @param metadata - * A length 3
String
array that will be used to pass - * the radar id, dtype, and dt back to the caller. - * @return If the specified file is a DHR radar file. + * The name of the DHR radar file + * @throws EdexException + * If IOExceptions occur */ - private boolean checkFile(String fileName, String fileHeader, - String[] metadata) { + private boolean checkFile(File hpeFile) throws EdexException { + /* + * Read the contents of the file into memory. + */ + BufferedInputStream inStream = null; + try { + inStream = new BufferedInputStream(new FileInputStream(hpeFile)); + } catch (FileNotFoundException e) { + throw new EdexException("HPE Cannot find file: " + hpeFile, e); + } + byte[] fileContents = new byte[(int) hpeFile.length()]; + try { + inStream.read(fileContents); + } catch (IOException e) { + throw new EdexException("HPE Error reading file: " + hpeFile, e); + } finally { + try { + inStream.close(); + } catch (IOException e1) { + throw new EdexException("HPE Error closing stream to file: " + + hpeFile, e1); + } + } + String outPath = ""; + String fname = hpeFile.getName(); + String radid = ""; + String dtype = ""; + String dt = ""; + String outname = ""; + + Matcher r = radPat.matcher(fname); + /* + * Copy off the first few bytes to see if leading bytes are present + * before the WMO header + */ + if (fileContents.length < 80) { + return false; + } + String fileStartStr = new String(fileContents, 0, 80); + /* * Find the WMO header */ - Matcher r = RAD_PATTERN.matcher(fileName); - Matcher wmomat = WMO_PATTERN.matcher(fileHeader); + Matcher wmomat = WMO_PATTERN.matcher(fileStartStr); + Matcher dhrmat = ldmPat.matcher(fileStartStr); if (r.find()) { // logger.info("HPE DHRSrv found Radar file."); - // getting the radid - metadata[RADID_IDX] = r.group(1).substring(1).toUpperCase().trim(); + radid = r.group(1).substring(1).toUpperCase().trim(); String ftype = r.group(2); - // getting the dt - metadata[DT_IDX] = r.group(3); - // getting the dtype - if (ftype.equals(DHRTYPE)) { - metadata[DTYPE_IDX] = DHR; + dt = r.group(3); + if (ftype.equals(dhrtype)) { + dtype = DHR; // logger.info("HPE DHRSrv found Radar file type DHR."); - } else if (ftype.equals(DSPTYPE1) || ftype.equals(DSPTYPE2)) { - metadata[DTYPE_IDX] = DSP; + } else if (ftype.equals(dsptype1) || ftype.equals(dsptype2)) { + dtype = DSP; // logger.info("HPE DHRSrv found Radar file type DSP."); } else { // logger.info("HPE DHRSrv found Radar type unknown."); return false; } } else if (wmomat.find()) { - Matcher dhrmat = LDM_PATTERN.matcher(fileHeader); if (dhrmat.find()) { - // logger.info("HPEDHRSrv found LDM file."); - metadata[DT_IDX] = wmomat.group(1).substring( - wmomat.group(1).length() - 6); - metadata[RADID_IDX] = dhrmat.group(2).toUpperCase().trim(); - metadata[DTYPE_IDX] = dhrmat.group(1).toUpperCase().trim(); - if ((!metadata[DTYPE_IDX].equals(DSP)) - && (!metadata[DTYPE_IDX].equals(STP)) - && (!metadata[DTYPE_IDX].equals(DHR))) { + // logger.info("HPE DHRSrv found LDM file."); + dt = wmomat.group(1).substring(wmomat.group(1).length() - 6); + radid = dhrmat.group(2).toUpperCase().trim(); + dtype = dhrmat.group(1).toUpperCase().trim(); + if (!dtype.equals(DSP) || !dtype.equals(STP) + || !dtype.equals(DHR)) { return false; } } else { @@ -360,42 +223,80 @@ public class HPEDhrSrv { } else { return false; } - // logger.info("HPE DHRSrv querying db for radid=" + radid // + " and use_radar=T."); String query = String.format( "select * from radarloc where radid='%s' and use_radar='T' ", - metadata[RADID_IDX]); - CoreDao dao = new CoreDao(DaoConfig.forDatabase("ihfs")); + radid); + dao = new CoreDao(DaoConfig.forDatabase("ihfs")); Object[] rs = dao.executeSQLQuery(query); - // logger.info("HPE DHRSrv querying db done."); - return (rs.length > 0); + // logger.info("HPE DHRSrv querying db done."); + if (rs.length > 0) { + + outname = dtype + radid + "." + dt; + if (dtype.equals(DHR)) { + outPath = appsDefaults.getToken("dhr_prod_dir"); + } else { + outPath = appsDefaults.getToken("dsp_prod_dir"); + } + File oP = new File(outPath); + if (!oP.exists()) { + oP.mkdir(); + } + + int offset = 0; + offset = findStartRadarData(fileStartStr); + outFile = new File(FileUtil.join(outPath, outname)); + BufferedOutputStream outStream = null; + + try { + outStream = new BufferedOutputStream(new FileOutputStream( + outFile)); + } catch (FileNotFoundException e) { + throw new EdexException("HPE Cannot find file: " + outFile, e); + } + + try { + outStream.write(fileContents, offset, fileContents.length + - offset); + // logger.info("HPE Re-writing contents of file: " + hpeFile + // + " to " + outFile); + } catch (IOException e) { + throw new EdexException( + "HPE Error writing updated contents of HPE file: " + + outFile, e); + } finally { + try { + outStream.close(); + } catch (IOException e1) { + throw new EdexException("HPE Unable to close file: " + + outFile, e1); + } + } + return true; + } else { + return false; + } } - /** - * Given the header data from a radar file, this function determines the - * ending offset of the WMO header. - * - * @param headerInfo - * The header data from a radar file. - * @return Returns the offset after the last character in the WMO header. - */ private int findStartRadarData(String headerInfo) { + int startOfRadarData = 0; Matcher matcher = WMO_PATTERN.matcher(headerInfo); - if (matcher.find()) { - return matcher.end(); + boolean foundHeader = matcher.find(); + if (foundHeader) { + startOfRadarData = matcher.end(); } - return 0; + return startOfRadarData; } public static final void main(String[] args) { String input = "SDUS53_ABR_DSP_201538_185076111.rad"; String input2 = "koax.32.20111020_1553"; - Matcher m = LDM_PATTERN.matcher(input); - Matcher p = RAD_PATTERN.matcher(input2); + Matcher m = ldmPat.matcher(input); + Matcher p = radPat.matcher(input2); if (m.find()) { System.out.println(m.group(0)); diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/MpeRUCFreezingLevel.java b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/MpeRUCFreezingLevel.java index 844b5af065..31a42070c9 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/MpeRUCFreezingLevel.java +++ b/edexOsgi/com.raytheon.uf.edex.ohd/src/com/raytheon/uf/edex/ohd/pproc/MpeRUCFreezingLevel.java @@ -275,8 +275,6 @@ public class MpeRUCFreezingLevel { out = new DataOutputStream(ofstream); bw = new BufferedWriter(new OutputStreamWriter(out)); - bw.write("\r\r\n"); - for (Entryentry : freezingStations .entrySet()) { @@ -513,7 +511,7 @@ public class MpeRUCFreezingLevel { */ private String getFormattedDate(Date date) { if (date != null) { - SimpleDateFormat formatter = ShefConstants.YYMMDD_FORMAT; + SimpleDateFormat formatter = ShefConstants.YYYYMMDD_FORMAT; return formatter.format(date); } else { return null; diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/CompositeReflectivityProduct.java b/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/CompositeReflectivityProduct.java index 45dc39faf1..2bf44454a4 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/CompositeReflectivityProduct.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/CompositeReflectivityProduct.java @@ -28,6 +28,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import org.geotools.coverage.grid.GridGeometry2D; @@ -66,6 +67,8 @@ import com.raytheon.uf.edex.core.EDEXUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 05/07/2009 2037 dhladky Initial Creation. + * 02/22/2012 DR14414 mgamazay Added initializing the ScanTableData table + * to an empty map if no features are present. * * table = getTableData(); table.setFeatureIds(catKeys); + // DR14414 - if there are no items in the cat map - remove items from the table + if (catKeys.size() == 0) { + table.setTableData(new ConcurrentHashMap ()); + } table.setVcp(rec.getVolumeCoveragePattern()); filter.setValidTime(rec.getDataTime().getRefTime()); diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/MesoCycloneTabularProduct.java b/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/MesoCycloneTabularProduct.java index aa15e5a588..b8e1fc7b7e 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/MesoCycloneTabularProduct.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.scan/src/com/raytheon/uf/edex/plugin/scan/process/MesoCycloneTabularProduct.java @@ -24,12 +24,19 @@ import java.util.ArrayList; import java.util.Date; import java.util.Map; import java.util.regex.Pattern; +import java.util.StringTokenizer; import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; import com.raytheon.uf.common.dataplugin.radar.util.RadarConstants; import com.raytheon.uf.common.dataplugin.radar.util.RadarConstants.MapValues; import com.raytheon.uf.common.dataplugin.radar.util.RadarRecordUtil; + +import com.raytheon.uf.common.dataplugin.radar.level3.GraphicBlock; +import com.raytheon.uf.common.dataplugin.radar.level3.TextSymbolPacket; +import com.raytheon.uf.common.dataplugin.radar.level3.SymbologyPacket; +import com.raytheon.uf.common.dataplugin.radar.level3.Layer; + import com.raytheon.uf.common.dataplugin.scan.data.DMDTableDataRow; import com.raytheon.uf.common.dataplugin.scan.data.ScanTableData; import com.raytheon.uf.common.dataplugin.scan.data.ScanTableDataRow; @@ -49,12 +56,17 @@ import com.vividsolutions.jts.geom.Coordinate; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 05/07/2009 2037 dhladky Initial Creation. - * + * 05/07/2009 2037 dhladky Initial Creation. + * 02/23/2012 14536 Xiaochuan Add method getIdsFromGraphicBlock() to + * hold the ids that have the same order + * as the ids in source file. + * + * * mesoKeys = (ArrayList ) rec - .getIds(MapValues.MESO_TYPE); - + ArrayList mesoKeys = (ArrayList ) getIdsFromGraphicBlock(rec); + // first check for alarms - if (mesoKeys != null) { - - ScanAlarmXML alarms = filter.getAlarmData(); + if (mesoKeys != null) { + ScanAlarmXML alarms = filter.getAlarmData(); StringBuffer alarmString = null; ArrayList newMesoKeys = getAdditions(mesoKeys, table); @@ -134,16 +143,14 @@ public class MesoCycloneTabularProduct extends RadarProduct { // remove all rows regardless of age, we need it to blank for (String id : table.getTableData().keySet()) { - // System.out.println("Removing MESO ID: " + id); table.removeRow(id); } // add all rows in meso product if ((rec != null) && (mesoKeys != null)) { - - table.setFeatureIds(mesoKeys); - - for (String fid : mesoKeys) { - // System.out.println("Adding MESO FID: " + fid); + table.setFeatureIds(mesoKeys); + + for (String fid : mesoKeys) + { table.addRow( fid, write(new DMDTableDataRow(rec.getDataTime()), rec, @@ -160,6 +167,42 @@ public class MesoCycloneTabularProduct extends RadarProduct { } } + /** + * @param rec + * @return + */ + public ArrayList getIdsFromGraphicBlock(RadarRecord rec) { + GraphicBlock gb = rec.getGraphicBlock(); + ArrayList ids = new ArrayList (); + + if (gb != null) { + Layer[] pages = gb.getPages(); + + // Go through each page + for (int i = 0; i < pages.length; i++) { + SymbologyPacket[] packets = pages[i].getPackets(); + + // keys listed in the first packet + if (packets[0] instanceof TextSymbolPacket) { + String ln_id = ((TextSymbolPacket) packets[0]).getTheText(); + StringTokenizer st = new StringTokenizer(ln_id, " "); + int countE = 0; + int countId = 2; + while (st.hasMoreTokens()) { + String e = st.nextToken(); + if (countE == countId) { + ids.add(e); + countId += 2; + } + countE++; + } + } + } + } + + return ids; + } + @Override public ScanTableDataRow write(ScanTableDataRow row, PersistablePluginDataObject rec, String key) { diff --git a/edexOsgi/com.raytheon.uf.edex.topo/src/com/raytheon/uf/edex/topo/TopoQuery.java b/edexOsgi/com.raytheon.uf.edex.topo/src/com/raytheon/uf/edex/topo/TopoQuery.java index 0c86fe49dc..1e891747a3 100644 --- a/edexOsgi/com.raytheon.uf.edex.topo/src/com/raytheon/uf/edex/topo/TopoQuery.java +++ b/edexOsgi/com.raytheon.uf.edex.topo/src/com/raytheon/uf/edex/topo/TopoQuery.java @@ -21,29 +21,38 @@ package com.raytheon.uf.edex.topo; import java.awt.Point; import java.awt.Rectangle; -import java.awt.image.Raster; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import java.util.Hashtable; import java.util.Map; -import javax.media.jai.Interpolation; - import org.geotools.coverage.grid.GeneralGridEnvelope; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridCoverageFactory; import org.geotools.coverage.grid.GridGeometry2D; +import org.geotools.factory.Hints; import org.geotools.geometry.DirectPosition2D; import org.geotools.geometry.GeneralEnvelope; +import org.geotools.referencing.CRS; +import org.geotools.referencing.ReferencingFactoryFinder; +import org.geotools.referencing.operation.AbstractCoordinateOperationFactory; import org.geotools.referencing.operation.DefaultMathTransformFactory; import org.geotools.referencing.operation.builder.GridToEnvelopeMapper; +import org.geotools.referencing.operation.transform.IdentityTransform; import org.opengis.coverage.grid.GridEnvelope; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.Envelope; import org.opengis.metadata.spatial.PixelOrientation; +import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.crs.GeographicCRS; +import org.opengis.referencing.crs.ProjectedCRS; import org.opengis.referencing.datum.PixelInCell; +import org.opengis.referencing.operation.CoordinateOperationFactory; import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.MathTransformFactory; +import org.opengis.referencing.operation.TransformException; import com.raytheon.uf.common.datastorage.DataStoreFactory; import com.raytheon.uf.common.datastorage.IDataStore; @@ -77,6 +86,8 @@ import com.vividsolutions.jts.geom.Coordinate; * ------------ ---------- ----------- -------------------------- * 11/19/2007 #377 randerso Initial creation * Jun 13, 2008 #1160 randerso Moved to server side + * 03/09/2012 DR 14581 D. Friedman Fix grid referencing and use custom + * nearest-neighbor resampling. * * transforms = new ArrayList (); + ArrayList toGeoXforms = new ArrayList (); + ArrayList sourceToGeoXforms = new ArrayList (); - return f1; + MathTransform targetGtoCRS = targetGG.getGridToCRS(PixelInCell.CELL_CENTER); + MathTransform sourceCRStoG = sourceGC.getGridGeometry().getCRSToGrid2D(PixelOrientation.CENTER); + CoordinateReferenceSystem targetCRS = targetGG.getCoordinateReferenceSystem(); + CoordinateReferenceSystem sourceCRS = sourceGC.getCoordinateReferenceSystem(); + + transforms.add(targetGtoCRS); + if (! CRS.equalsIgnoreMetadata(sourceCRS, targetCRS)) { + GeographicCRS sourceGeoCRS = null; + GeographicCRS targetGeoCRS = null; + if (sourceCRS instanceof ProjectedCRS) { + sourceGeoCRS = ((ProjectedCRS) sourceCRS).getBaseCRS(); + } + if (targetCRS instanceof ProjectedCRS) { + targetGeoCRS = ((ProjectedCRS) targetCRS).getBaseCRS(); + } + try { + transforms.add(CRS.findMathTransform(targetCRS, targetGeoCRS, true)); + toGeoXforms.addAll(transforms); + if (CRS.equalsIgnoreMetadata(sourceGeoCRS, targetGeoCRS)) { + // nothing... + } else { + transforms.add(CRS.findMathTransform(targetGeoCRS, sourceGeoCRS)); + } + transforms.add(CRS.findMathTransform(sourceGeoCRS, sourceCRS, true)); + sourceToGeoXforms.add(0, CRS.findMathTransform(sourceCRS, sourceGeoCRS)); + } catch (FactoryException e) { + statusHandler.error(e.getMessage(), e); + return output; + } + } + transforms.add(sourceCRStoG); + sourceToGeoXforms.add(0, sourceGC.getGridGeometry().getGridToCRS(PixelInCell.CELL_CENTER)); + + MathTransform mt; + try { + mt = concatenateTransforms(transforms); + } catch (FactoryException e) { + statusHandler.error(e.getMessage(), e); + return output; + } + + double[] coord = new double[2]; + for (int y = 0; y < targetHeight; ++y) { + for (int x = 0; x < targetWidth; ++x) { + coord[0] = x; + coord[1] = y; + try { + mt.transform(coord, 0, coord, 0, 1); + } catch (TransformException e) { + continue; + } + + int sx = (int) Math.round(coord[0]); + int sy = (int) Math.round(coord[1]); + if (sx >= 0 && sx < sourceWidth && sy >= 0 && sy < sourceHeight) + output[y * targetWidth + x] = sourceData[sy][sx]; + } + } + + return output; + } + + private static MathTransform concatenateTransforms(ArrayList transforms) throws FactoryException { + Hints hints = new Hints(); + final CoordinateOperationFactory factory = + ReferencingFactoryFinder.getCoordinateOperationFactory(hints); + final MathTransformFactory mtFactory; + if (factory instanceof AbstractCoordinateOperationFactory) { + mtFactory = ((AbstractCoordinateOperationFactory) factory).getMathTransformFactory(); + } else { + mtFactory = ReferencingFactoryFinder.getMathTransformFactory(hints); + } + + MathTransform mt = null; + for (MathTransform mti : transforms) { + if (mt == null) + mt = mti; + else { + mt = mtFactory.createConcatenatedTransform(mt, mti); + } + } + + return mt != null ? mt : IdentityTransform.create(2); } } diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/configuration/svcbu.properties b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/configuration/svcbu.properties index fdb541d551..d3d412f86f 100644 --- a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/configuration/svcbu.properties +++ b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/configuration/svcbu.properties @@ -83,10 +83,26 @@ # at 15 after each hour, the service # backup GUI, and from GFE via the # 'Send Grids to NDFD...' script -# 2 = grids are exported only by the service -# backup GUI and from GFE via the 'Send -# Grids to NDFD...' script' - +# 2 = grids are exported only by the service backup GUI and from GFE via the 'Send +# Grids to NDFD...' script' +# +# NATIONAL_CENTER Indicates that the site is a national center +# This will allow for special treatment of national centers +# when determining site id's. For crons these come from AW_SITE_IDENTIFIER at regular sites. +# At national centers the values will come from activeSites.txt +# VALID VALUES: 0 = this site is not a national center +# 1 = this site is a national center +# +# SVCBU_USER Indicates that the site can configure a special user to +# run GFE when in service backup +# VALID VALUES: 0 = do not use a designated user to run +# GFE when in service backup +# 1 = use a designated user to run GFE +# when in service backup +# +# SVCBU_USER_ID The user id of the designated user to run GFE when +# in service backup +# # Directories used by Service Backup GFESUITE_HOME=${AWIPS_HOME}/GFESuite GFESUITE_BIN=${GFESUITE_HOME}/bin @@ -107,4 +123,7 @@ SVCBU_FAILED_SITE_PORT=98000001 SVCBU_GRIDAREA=ISC_Send_Area SVCBU_ADDRESSEE=TNCF SVCBU_WMO_HEADER=SVCBKPIFP +SVCBU_USER=0 +SVCBU_USER_ID="" EXPORT_GRID=1 +NATIONAL_CENTER=0 diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/createGFEStartScript b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/createGFEStartScript index c5384d97f6..926f6eef87 100644 --- a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/createGFEStartScript +++ b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/createGFEStartScript @@ -10,13 +10,33 @@ SITE_CAPS=`echo ${1}|tr [a-z] [A-Z]` . ${AWIPS_HOME}/GFESuite/ServiceBackup/configuration/svcbu.env +# Create the log file +logdir=${IFPS_LOG}/`date +%Y%m%d` +logfil=svcbu_createGFEStartScript`date +%H%M` +logfile=${logdir}/${logfil} + +[ ! -d ${logdir} ] && (umask 000;mkdir ${logdir}) +touch ${logdir}/${logfil} +exec 1>${logdir}/${logfil} 2>&1 + + LAUNCH_SCRIPT=${AWIPS_HOME}/GFESuite/ServiceBackup/.launch_cave.sh log_msg "Creating GFE launch script for ${SITE_CAPS} at ${LAUNCH_SCRIPT}" log_msg "CAVE location: ${CAVE_LAUNCH_SCRIPT}" +if [ $SVCBU_USER -eq 1 ] && [ "$SVCBU_USER_ID" = "" ]; then + log_msg "You do not have a user id configured for ServiceBackup" + log_msg "GFE will start with your regular user id" +fi + echo "#!/bin/bash">${LAUNCH_SCRIPT} -echo "${CAVE_LAUNCH_SCRIPT} -site ${SITE_CAPS} -perspective GFE -server ec:9581/services" >> ${LAUNCH_SCRIPT} +if [ $SVCBU_USER -eq 1 ] && [ "$SVCBU_USER_ID" != "" ]; then + echo "${CAVE_LAUNCH_SCRIPT} -site ${SITE_CAPS} -u $SVCBU_USER_ID -perspective GFE -server ec:9581/services" >> ${LAUNCH_SCRIPT} +else + echo "${CAVE_LAUNCH_SCRIPT} -site ${SITE_CAPS} -perspective GFE -server ec:9581/services" >> ${LAUNCH_SCRIPT} +fi + chmod +x ${LAUNCH_SCRIPT} SITE_LOWER=`echo ${AW_SITE_IDENTIFIER}|tr [a-z] [A-Z]` diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_grids b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_grids index abd8f61c22..bd6b4b1ca9 100755 --- a/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_grids +++ b/edexOsgi/com.raytheon.uf.tools.gfesuite.servicebackup/svcBackup/ServiceBackup/scripts/export_grids @@ -1,4 +1,5 @@ #!/bin/bash + if [ ${#AWIPS_HOME} = 0 ] then path_to_script=`readlink -f $0` @@ -16,26 +17,11 @@ fi . ${AWIPS_HOME}/GFESuite/ServiceBackup/configuration/svcbu.env -if [ $EXPORT_GRID = 0 ] -then - log_msg "You turned off the export grid option. Check EXPORT_GRID" - log_msg 100 - exit 1 -elif [ $EXPORT_GRID = 2 ] && [ "$1" = "-c" ] -then - log_msg "export_grids cron disabled" - exit 1 -fi - #while [ "$(ls -A ${LOCK_DIR})" ] #do # sleep 5 #done -SITE=`echo ${2} | tr '[A-Z]' '[a-z]'` -CAPS_SITE=`echo ${2} | tr [a-z] [A-Z]` -export SITE - # Create the log file logdir=${IFPS_LOG}/`date +%Y%m%d` logfil=svcbu_export_grids_`date +%H%M` @@ -44,128 +30,164 @@ logfile=${logdir}/${logfil} touch ${logdir}/${logfil} exec 1>${logdir}/${logfil} 2>&1 -manuallockFile=${LOCK_DIR}/${SITE}exportGrids -cronLockFile=${LOCK_DIR}/${SITE}exportGridscron -lockFile=${manuallockFile} -LOGGER=log_msg -if [ $1 = "-c" ] -then +# DR14464 - netcdf file creation is now a function to allow it to be called more than once for +# national centers +perform_export() { + SITE=`echo ${1} | tr '[A-Z]' '[a-z]'` + CAPS_SITE=`echo ${1} | tr [a-z] [A-Z]` + export SITE + + manuallockFile=${LOCK_DIR}/${SITE}exportGrids + cronLockFile=${LOCK_DIR}/${SITE}exportGridscron + lockFile=${manuallockFile} + LOGGER=log_msg + + if [ $1 = "-c" ] + then LOGGER=echo_msg lockFile=${cronLockFile} -fi + fi -# Check the status of the lock file to see if we are OK to proceed + # Check the status of the lock file to see if we are OK to proceed -if [ -f ${manuallockFile} ] -then + if [ -f ${manuallockFile} ] + then $LOGGER Cannot export grids for ${CAPS_SITE}. Export grids process already in progress! Cron will not run this hour. exit 1 -fi + fi -touch ${lockFile} + touch ${lockFile} -$LOGGER "Starting exporting grids..." -$LOGGER 0 + $LOGGER "Starting exporting grids..." + $LOGGER 0 -# -# If this is a non-wfo/non-rfc site, they may not have an edit area for clipping - handle it -# -if [ "$SVCBU_GRIDAREA" == "" ] ; then - SVCBU_MASK="" -else - SVCBU_MASK="-m $SVCBU_GRIDAREA" -fi + # + # If this is a non-wfo/non-rfc site, they may not have an edit area for clipping - handle it + # + if [ "$SVCBU_GRIDAREA" == "" ] ; then + SVCBU_MASK="" + else + SVCBU_MASK="-m $SVCBU_GRIDAREA" + fi -# Need to create the start and end time arguments for ifpnetCDF -# The start time needs to be 6 hours prior to current time, and end time needs to be 6 hours after the 9th day time. -starttime=`date -d "24 hours ago" +%Y%m%d`_`date -d "24 hours ago" +%H00` -endtime=`date -d "+8 days 6 hours" +%Y%m%d`_`date -d "+8 days 6 hours" +%H00` -# -$LOGGER 25 -$LOGGER "Running ifpnetCDF..." -# Name of the database to use in ifpServer to grab grids from. -# NOTE: SVCBU_DB must be defined in ifps-ccc.env file. Defaults to Official. -if [ -n "${SVCBU_DB}" ] -then - DB_NAME=${CAPS_SITE}_GRID__${SVCBU_DB}_00000000_0000 -else - DB_NAME=${CAPS_SITE}_GRID__Official_00000000_0000 -fi + # Need to create the start and end time arguments for ifpnetCDF + # The start time needs to be 6 hours prior to current time, and end time needs to be 6 hours after the 9th day time. + starttime=`date -d "24 hours ago" +%Y%m%d`_`date -d "24 hours ago" +%H00` + endtime=`date -d "+8 days 6 hours" +%Y%m%d`_`date -d "+8 days 6 hours" +%H00` + # + $LOGGER 25 + $LOGGER "Running ifpnetCDF..." + # Name of the database to use in ifpServer to grab grids from. + # NOTE: SVCBU_DB must be defined in ifps-ccc.env file. Defaults to Official. + if [ -n "${SVCBU_DB}" ] + then + DB_NAME=${CAPS_SITE}_GRID__${SVCBU_DB}_00000000_0000 + else + DB_NAME=${CAPS_SITE}_GRID__Official_00000000_0000 + fi -$LOGGER ${DB_NAME} + $LOGGER ${DB_NAME} -NETCDF_PATH=${GFESUITE_HOME}/exportgrids -export NETCDF_TMP_PATH=${NETCDF_PATH}/tmp -if [ ! -d ${NETCDF_TMP_PATH} ]; then - mkdir ${NETCDF_TMP_PATH} - chmod 777 ${NETCDF_TMP_PATH} -fi + NETCDF_PATH=${GFESUITE_HOME}/exportgrids + export NETCDF_TMP_PATH=${NETCDF_PATH}/tmp + if [ ! -d ${NETCDF_TMP_PATH} ]; then + mkdir ${NETCDF_TMP_PATH} + chmod 777 ${NETCDF_TMP_PATH} + fi -# Implement wx element trimming. -# For this, we'll read from a flat file in ${IFPS_DATA} that will contain list of element a site wants to include. -# We'll also check if the site has $SVCBU_TRIM_ELEMS variable set to 1. We will only do wx element trimming if this variable is set to 1. -# Otherwise, we'll continue to send all grids. -if [ "${SVCBU_TRIM_ELEMS}" != "" -a "${SVCBU_TRIM_ELEMS}" = "1" ] -then - # Check if we have the file that has list of elements to trim for. - if [ -f ${IFPS_DATA}/svcbu_export_elements.${SITE} ]; then - # Building the -p arguments to ifpnetCDF. - wxflags="" - for elem in `cat ${IFPS_DATA}/svcbu_export_elements.${SITE}` - do - wxflags="$wxflags -p ${elem}" - done - #Now run ifpnetCDF with $wxflags as well as time flags. - ${GFESUITE_BIN}/ifpnetCDF -o ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -h ${SVCBU_HOST} -r ${CDSPORT} -d ${DB_NAME} -k -t ${SVCBU_MASK} ${wxflags} - #check if the netcdf file is there;if not,exit - if [ $? -ne 0 ] - then - $LOGGER "ifpnetCDF failed. Export exits." - rm -f ${lockFile} - $LOGGER 100 - exit 1 - fi - else - $LOGGER "export_grid_data was not able to find ${IFPS_DATA}/svcbu_export_elements.${SITE} file." - $LOGGER "Without this file, ifpnetCDF will not know how to trim for needed weather elements." - $LOGGER "ifpnetCDF will run without doing any trimming." - #Starting ifpnetCDF to pack the grids (netcdf file is stored in the IFPS_LOG dir) - ${GFESUITE_BIN}/ifpnetCDF -o ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -h $SVCBU_HOST -r ${CDSPORT} -d ${DB_NAME} -k -t ${SVCBU_MASK} - #check if the netcdf file is there;if not,exit - if [ $? -ne 0 ] - then - $LOGGER "ifpnetCDF failed. Export exits." - rm -f ${lockFile} - $LOGGER 100 - exit 1 - fi - fi -else - # NOTE: This is the case when no wx elems trimming will done. ifpnetCDF file will contain everything. - #Starting ifpnetCDF to pack the grids (netcdf file is stored in the IFPS_LOG dir) - ${GFESUITE_BIN}/ifpnetCDF -o ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -h $SVCBU_HOST -r ${CDSPORT} -d ${DB_NAME} -k -t ${SVCBU_MASK} - #check if the netcdf file is there;if not,exit before we call msg_send - if [ $? -ne 0 ] - then + # Implement wx element trimming. + # For this, we'll read from a flat file in ${IFPS_DATA} that will contain list of element a site wants to include. + # We'll also check if the site has $SVCBU_TRIM_ELEMS variable set to 1. We will only do wx element trimming if this variable is set to 1. + # Otherwise, we'll continue to send all grids. + if [ "${SVCBU_TRIM_ELEMS}" != "" -a "${SVCBU_TRIM_ELEMS}" = "1" ] + then + # Check if we have the file that has list of elements to trim for. + if [ -f ${IFPS_DATA}/svcbu_export_elements.${SITE} ]; then + # Building the -p arguments to ifpnetCDF. + wxflags="" + for elem in `cat ${IFPS_DATA}/svcbu_export_elements.${SITE}` + do + wxflags="$wxflags -p ${elem}" + done + #Now run ifpnetCDF with $wxflags as well as time flags. + ${GFESUITE_BIN}/ifpnetCDF -o ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -h ${SVCBU_HOST} -r ${CDSPORT} -d ${DB_NAME} -k -t ${SVCBU_MASK} ${wxflags} + #check if the netcdf file is there;if not,exit + if [ $? -ne 0 ] + then + $LOGGER "ifpnetCDF failed. Export exits." + rm -f ${lockFile} + $LOGGER 100 + exit 1 + fi + else + $LOGGER "export_grids was not able to find ${IFPS_DATA}/svcbu_export_elements.${SITE} file." + $LOGGER "Without this file, ifpnetCDF will not know how to trim for needed weather elements." + $LOGGER "ifpnetCDF will run without doing any trimming." + #Starting ifpnetCDF to pack the grids (netcdf file is stored in the IFPS_LOG dir) + ${GFESUITE_BIN}/ifpnetCDF -o ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -h $SVCBU_HOST -r ${CDSPORT} -d ${DB_NAME} -k -t ${SVCBU_MASK} + #check if the netcdf file is there;if not,exit + if [ $? -ne 0 ] + then + $LOGGER "ifpnetCDF failed. Export exits." + rm -f ${lockFile} + $LOGGER 100 + exit 1 + fi + fi + else + # NOTE: This is the case when no wx elems trimming will done. ifpnetCDF file will contain everything. + #Starting ifpnetCDF to pack the grids (netcdf file is stored in the IFPS_LOG dir) + ${GFESUITE_BIN}/ifpnetCDF -o ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -h $SVCBU_HOST -r ${CDSPORT} -d ${DB_NAME} -k -t ${SVCBU_MASK} + #check if the netcdf file is there;if not,exit before we call msg_send + if [ $? -ne 0 ] + then $LOGGER ifpnetCDF failed. rm -f ${lockFile} $LOGGER 100 exit 1 - fi -fi + fi + fi -$LOGGER "Copying ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf to ${NETCDF_PATH}/${SITE}Grd.netcdf" -cp ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf ${NETCDF_PATH}/${SITE}Grd.netcdf + $LOGGER "Copying ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf to ${NETCDF_PATH}/${SITE}Grd.netcdf" + cp ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf ${NETCDF_PATH}/${SITE}Grd.netcdf -if [ -f ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf ] + if [ -f ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf ] + then + $LOGGER "Removing ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf" + rm -f ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf + fi + + rm -f ${lockFile} + $LOGGER 100 +} +# end DR14464 change + +if [ $EXPORT_GRID = 0 ] then - $LOGGER "Removing ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf" - rm -f ${NETCDF_TMP_PATH}/${SITE}Grd.netcdf -fi -# If we get here, things are successful. + log_msg "You turned off the export grid option. Check EXPORT_GRID" + log_msg 100 + exit 1 +elif [ $EXPORT_GRID = 2 ] && [ "$1" = "-c" ] +then + log_msg "export_grids cron disabled" + exit 1 +elif [ $EXPORT_GRID = 1 ] && [ $NATIONAL_CENTER = 1 ] # DR14464 changes - loop through active sites +then + log_msg "You are configured as a national center. Will use active sites list for site id generation." + work_site=`echo ${2} | tr [a-z] [A-Z]` + site_list=( `cat $LOCALIZATION_PATH/edex_static/site/$work_site/config/activeSites.txt` ) + for site in "${site_list[@]}" + do + log_msg "Processing $site" + perform_export ${site} + done +else # this processes non-national centers the old way using AW_SITE_IDENTIFIER if run by cron + log_msg "Processing $2" + perform_export ${2} +fi # end DR14464 changes + +# Completed successfully $LOGGER "All done. Export Gridded data has completed" -rm -f ${lockFile} -$LOGGER 100 exit 0 diff --git a/edexOsgi/com.raytheon.uf.tools.gfesuite/cli/src/activeTable/MergeVTEC.py b/edexOsgi/com.raytheon.uf.tools.gfesuite/cli/src/activeTable/MergeVTEC.py index 6bf0118ffc..11123b11b7 100644 --- a/edexOsgi/com.raytheon.uf.tools.gfesuite/cli/src/activeTable/MergeVTEC.py +++ b/edexOsgi/com.raytheon.uf.tools.gfesuite/cli/src/activeTable/MergeVTEC.py @@ -172,8 +172,10 @@ def convertToNewFormat(newTable): for dct in newTable: dct['officeid'] = dct['oid'] dct['vtecstr'] = dct['vstr'] - dct['endTime'] = dct['end'] - dct['startTime'] = dct['start'] + dct['endTime'] = int(dct['end']) + dct['startTime'] = int(dct['start']) + dct['purgeTime'] = int(dct['purgeTime']) + dct['issueTime'] = int(dct['issueTime']) dct['phensig'] = dct['key'] dct['state'] = 'Decoded' if dct['endTime'] >= maxFutureTime: @@ -184,6 +186,9 @@ def convertToNewFormat(newTable): if not dct.has_key('rawMessage'): dct['rawMessage'] = '' + # Note: this is not always correct + dct['xxxid'] = dct['officeid'][1:] + if dct.has_key('text'): dct['segText'] = dct['text'] # adapted from WarningDecoder... diff --git a/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id b/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id index 416863268b..a9c10210ce 100644 --- a/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id +++ b/nativeLib/dist.native/i386-pc-linux-gnu.tar.REMOVED.git-id @@ -1 +1 @@ -09463575c5420002e5c6426d7686426363a08da6 \ No newline at end of file +853369bfa5ae7458b8f31dc33c6a817a6e257e36 \ No newline at end of file diff --git a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/DHRgather b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/DHRgather index 9355948bc6..cb8a313a08 100755 --- a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/DHRgather +++ b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/DHRgather @@ -375,7 +375,7 @@ then then echo "starting HPE processes via start_hpe script " $Dte >> $hpefnm - /bin/ksh $PPROC_BIN/launch_hpe & + /bin/ksh $PPROC_BIN/launch_hpe 2>$DHR_LOG_DIR/launch_hpe.err & exit 0 else diff --git a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe index 665887c411..84cddc3e58 100644 --- a/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe +++ b/nativeLib/rary.ohd.filesystem/awips/hydroapps/precip_proc/bin/launch_hpe @@ -6,5 +6,5 @@ RUN_FROM_DIR=`dirname $0` export PPROC_BIN=$(get_apps_defaults pproc_bin) -nohup ksh ./start_hpe & -exit 0 \ No newline at end of file +nohup ksh $PPROC_BIN/start_hpe >&1 > /dev/null & +exit 0 diff --git a/rpms/awips2.core/deploy.builder/build.sh_ORIG b/rpms/awips2.core/deploy.builder/build.sh_ORIG deleted file mode 100644 index 01f427fe19..0000000000 --- a/rpms/awips2.core/deploy.builder/build.sh_ORIG +++ /dev/null @@ -1,182 +0,0 @@ -#!/bin/bash -# We Have Been Created To Automate The Building Of The AWIPS II RPMs. - -# We Need To Setup Our Environment. -source env.sh - -if [ "${RPM_TOP_DIR}" = "" ]; then - echo "ERROR: You Must Set The RPM_TOP_DIR Environment Variable." - echo "Unable To Continue ... Terminating." - exit 1 -fi - -# !! NOTE !! - We Assume That We Are In A Workspace With The Installer Projects, -# The Edex Projects, The Cave Projects, The Native Projects, And Etc. -export WORKSPACE_DIR=`cd ../../../; pwd;` - -# The RPM Build Directory Structure Consists Of: -# ROOT = /usr/src/redhat -# * BUILD - -# * RPMS - Our Output RPMs -# * SOURCES - Not Important In Phase I -# * SPECS -# * SRPMS - -# Arguments -# ${1} == The Directory With The Specs File And Possibly Other Custom -# Scripts That May Need To Be Merged Into A Component. - -export AWIPSII_VERSION=`cat ${WORKSPACE_DIR}/Installer.rpm/version.txt` -export AWIPSII_RELEASE=`date +"%Y%m%d"` - -function buildRPM() -{ - BUILDROOT_DIR=/tmp/awips-component - - COMPONENT_DIR=${1} - COMPONENT_SPECS=${COMPONENT_DIR}/component.spec - - # We Need To Delete The 'BuildRoot' Directory After Each RPM Is - # Built Whether The Build Is Successful Or Not. - rm -rf ${BUILDROOT_DIR} - - # We Build The List Of Files That Need To Be Installed On-Demand Now. - # If One Exists From A Previous Build, Delete It. - if [ -f ${RPM_TOP_DIR}/BUILD/component-files.txt ]; then - rm -f ${RPM_TOP_DIR}/BUILD/component-files.txt - fi - - if [ "${COMPONENT_DIR}" = "Installer.version" ]; then - # Get the build information. - export AWIPSII_BUILD_DATE=`date +"%m-%d-%Y"` - export AWIPSII_BUILD_TIME=`date +"%T %Z"` - export AWIPSII_BUILD_SYSTEM=`uname -n` - - rpmbuild -ba --target=i386 \ - --define '_topdir %(echo ${RPM_TOP_DIR})' \ - --define '_component_version %(echo ${AWIPSII_VERSION})' \ - --define '_component_release %(echo ${AWIPSII_RELEASE})' \ - --define '_component_build_date %(echo ${AWIPSII_BUILD_DATE})' \ - --define '_component_build_time %(echo ${AWIPSII_BUILD_TIME})' \ - --define '_component_build_system %(echo ${AWIPSII_BUILD_SYSTEM})' \ - --define '_svn_tag %(echo ${AWIPSII_BUILD_TAG})' \ - --buildroot ${BUILDROOT_DIR} \ - ${COMPONENT_SPECS} - - RC=$? - if [ ${RC} -ne 0 ]; then - echo "Unable To Build The RPM Defined In: ${COMPONENT_DIR}." - echo "Unable To Continue ... Terminating." - exit 1 - fi - - unset AWIPSII_BUILD_DATE - unset AWIPSII_BUILD_TIME - unset AWIPSII_BUILD_SYSTEM - - return - fi - - export BUILDROOT_DIR="${BUILDROOT_DIR}" - # Build The RPM. - rpmbuild -ba --target=i386 \ - --define '_topdir %(echo ${RPM_TOP_DIR})' \ - --define '_build_root %(echo ${BUILDROOT_DIR})' \ - --define '_component_version %(echo ${AWIPSII_VERSION})' \ - --define '_component_release %(echo ${AWIPSII_RELEASE})' \ - --define '_baseline_workspace %(echo ${WORKSPACE_DIR})' \ - --buildroot ${BUILDROOT_DIR} \ - ${COMPONENT_SPECS} - # If We Are Unable To Build An RPM, Fail The Build: - RC="$?" - unset BUILDROOT_DIR - if [ ! "${RC}" = "0" ]; then - if [ ! "${COMPONENT_DIR}" = "Installer.ant" ] && - [ ! "${COMPONENT_DIR}" = "Installer.httpd-pypies" ] && - [ ! "${COMPONENT_DIR}" = "Installer.irt" ] && - [ ! "${COMPONENT_DIR}" = "Installer.java" ] && - [ ! "${COMPONENT_DIR}" = "Installer.ldm" ] && - [ ! "${COMPONENT_DIR}" = "Installer.postgresql" ] && - [ ! "${COMPONENT_DIR}" = "Installer.psql" ] && - [ ! "${COMPONENT_DIR}" = "Installer.python" ] && - [ ! "${COMPONENT_DIR}" = "Installer.server" ] && - [ ! "${COMPONENT_DIR}" = "Installer.tools" ]; then - echo "ERROR: Unable To Build The RPM Defined In: ${COMPONENT_DIR}." - echo "Unable To Continue ... Terminating." - exit 1 - fi - fi -} - -function buildLocalizationRPMs() -{ - BUILDROOT_DIR=/tmp/awips-component - # Find all of the localization.${site} directories, if there are any. - ls ${WORKSPACE_DIR}/localization.* > /dev/null 2>&1 - RC=$? - if [ ${RC} -ne 0 ]; then - # There are not any localization projects. - echo "INFO: There are not any localization projects." - return 0 - fi - - for dir in `cd ${WORKSPACE_DIR}; ls -1d localization.*`; do - site=`perl extractSite.pl ${dir}` - export LOCALIZATION_DIRECTORY="${dir}" - export COMPONENT_NAME="awips2-localization-${site}" - echo ${site} - - rm -rf ${BUILDROOT_DIR} - - rpmbuild -ba \ - --define '_topdir %(echo ${RPM_TOP_DIR})' \ - --define '_component_version %(echo ${AWIPSII_VERSION})' \ - --define '_component_release %(echo ${AWIPSII_RELEASE})' \ - --define '_component_name %(echo ${COMPONENT_NAME})' \ - --define '_baseline_workspace %(echo ${WORKSPACE_DIR})' \ - --define '_localization_directory %(echo ${LOCALIZATION_DIRECTORY})' \ - --buildroot ${BUILDROOT_DIR} \ - ../Installer.localization/component.spec - RC=$? - unset LOCALIZATION_DIRECTORY - unset COMPONENT_NAME - if [ ${RC} -ne 0 ]; then - exit 1 - fi - done -} - -export CFLAGS="-m32 -O2" -export LDFLAGS="-m32" -export BASECFLAGS="-m32 -O2" -export LD="ld -melf_i386" -# Get A List Of The RPM Directories (Excluding This One) -# Note: Presently, We Are In ../../Installer.rpm/deploy.builder - -buildLocalizationRPMs - -# Adjust Our Execution Position. -cd ../ - -# Only Build The RPMs That May Have Changed - AWIPS II-Specific Components. -buildRPM "Installer.version" -buildRPM "Installer.gfesuite-client" -buildRPM "Installer.gfesuite-server" -buildRPM "Installer.database-standalone-configuration" -buildRPM "Installer.database-server-configuration" -buildRPM "Installer.adapt-native" -buildRPM "Installer.alertviz" -buildRPM "Installer.aviation" -buildRPM "Installer.cli" -buildRPM "Installer.database" -buildRPM "Installer.maps-database" -buildRPM "Installer.gfe.climo" -buildRPM "Installer.topo" -buildRPM "Installer.hydroapps" -buildRPM "Installer.notification" -buildRPM "Installer.pypies" -buildRPM "Installer.rcm" -buildRPM "Installer.localapps-environment" - -unset AWIPSII_VERSION -unset AWIPSII_RELEASE diff --git a/rpms/awips2.qpid/SOURCES/queueCreator.sh b/rpms/awips2.qpid/SOURCES/queueCreator.sh index 2baedde30f..200ec7afe5 100755 --- a/rpms/awips2.qpid/SOURCES/queueCreator.sh +++ b/rpms/awips2.qpid/SOURCES/queueCreator.sh @@ -36,19 +36,11 @@ do done #define 24 Meg persistence queues for ingest -QUEUES=('vaa' 'textlightning' 'tcs' 'tcg' 'taf' 'svrwx' 'sfcobs' 'redbook' 'recco' 'q2' 'profiler' 'poessounding' 'pirep' 'lsr' 'loctables' 'ldadprofiler' 'ldadmesonet' 'ldadhydro' 'goessounding' 'cwa' 'ccfp' 'bufrua' 'bufrssmi' 'bufrsigwx' 'bufrquikscat' 'bufrncwf' 'bufrmthdw' 'bufrmos' 'bufrhdw' 'bufrascat' 'binlightning' 'airmet' 'airep' 'acars' 'Warning' 'ShefStaged' 'Satellite') +QUEUES=('vaa' 'textlightning' 'tcs' 'tcg' 'taf' 'svrwx' 'sfcobs' 'redbook' 'recco' 'q2' 'profiler' 'poessounding' 'pirep' 'lsr' 'loctables' 'ldadprofiler' 'ldadmesonet' 'ldadhydro' 'goessounding' 'dhr' 'cwa' 'ccfp' 'bufrua' 'bufrssmi' 'bufrsigwx' 'bufrquikscat' 'bufrncwf' 'bufrmthdw' 'bufrmos' 'bufrhdw' 'bufrascat' 'binlightning' 'airmet' 'airep' 'acars' 'Warning' 'ShefStaged' 'Satellite') for queue in ${QUEUES[*]}; do echo "Creating queue Ingest.$queue" qpid-config add queue Ingest.$queue --durable --file-count 16 --file-size 24 done -#define 24 Meg persistence queues for HPE ingest -QUEUES=('Ingest.dhr' 'dhrProcess') -for queue in ${QUEUES[*]}; -do - echo "Creating queue $queue" - qpid-config add queue $queue --durable --file-count 16 --file-size 24 -done - diff --git a/rpms/common/yum/arch.x86_64/comps.xml b/rpms/common/yum/arch.x86_64/comps.xml index 1d2cb0c5fc..47ef41a28f 100644 --- a/rpms/common/yum/arch.x86_64/comps.xml +++ b/rpms/common/yum/arch.x86_64/comps.xml @@ -75,6 +75,8 @@ awips2-python-pygtk awips2-python-pycairo awips2-localapps-environment +netcdf +netcdf-devel \ No newline at end of file