Merge "ASM #17882 - Changed scp commands to scp -q" into asm_15.1.1

Former-commit-id: dd0a7086a5cc5c829a1c31853d5022f47f8bbb93
This commit is contained in:
Sean.Webb 2015-08-11 14:17:02 -05:00 committed by Gerrit Code Review
commit 63d34b08dc
24 changed files with 981 additions and 325 deletions

View file

@ -62,7 +62,8 @@ import com.raytheon.uf.viz.thinclient.ui.ThinClientConnectivityDialog;
* May 19, 2014 3164 bsteffen Disable request compression if it
* doesn't work.
* Sep 05, 2014 3570 bclement HTTP client API changes
* Jan 26, 2014 3952 njensen gzip handled by default
* Jan 26, 2015 3952 njensen gzip handled by default
* Jul 06, 2015 4614 njensen explicitly enable gzip
*
* </pre>
*
@ -88,6 +89,7 @@ public class ThinClientLocalizationInitializer extends LocalizationInitializer {
HttpClient httpClient = HttpClient.getInstance();
HttpClientConfigBuilder confBuilder = new HttpClientConfigBuilder(
httpClient.getConfig());
confBuilder.setGzipEnabled(true);
HttpClient.configureGlobalInstance(confBuilder.build());
if (promptUI) {
ThinClientConnectivityDialog dlg = new ThinClientConnectivityDialog(

View file

@ -1082,7 +1082,7 @@ FORECASTER STEWART"""
# We need to reverse the order of the advisories so the latest
# advisories come first in this list
stormAdvisories.reverse()
stormAdvisories.sort(reverse=True)
lastTwoAdvisories = []

View file

@ -22,47 +22,6 @@
<displayList>
<displays xsi:type="d2DMapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
@ -84,6 +43,47 @@
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>

View file

@ -23,6 +23,48 @@
<displays xsi:type="d2DMapRenderableDisplay"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="false" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingPulses="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true"/>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning"
constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
@ -64,48 +106,6 @@
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true"/>
<properties isSystemResource="false" isBlinking="false"
isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0" />
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning"
constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="false" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingPulses="true">
<binOffset posOffset="0" negOffset="900" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>

View file

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
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.
-->
<bundle>
<displayList>
<displays xsi:type="d2DMapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="false" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingPulses="true">
<binOffset posOffset="0" negOffset="60" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="60" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
<binOffset posOffset="0" negOffset="60" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>
</bundle>

View file

@ -22,47 +22,6 @@
<displayList>
<displays xsi:type="d2DMapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<descriptor xsi:type="mapDescriptor">
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
<binOffset posOffset="0" negOffset="300" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="300" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
@ -84,6 +43,47 @@
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingCloudFlashes="true">
<binOffset posOffset="0" negOffset="300" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
<resource>
<loadProperties loadWithoutData="true">
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
<binOffset posOffset="0" negOffset="300" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
<constraint constraintValue="binlightning" constraintType="EQUALS" />
</mapping>
<mapping key="source">
<constraint constraintValue="${source}" constraintType="EQUALS" />
</mapping>
</metadataMap>
</resourceData>
</resource>
</descriptor>
</displays>
</displayList>

View file

@ -27,10 +27,11 @@
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="true" />
isVisible="false" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingPulses="true">
<binOffset posOffset="0" negOffset="3600" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">
@ -68,11 +69,10 @@
</loadProperties>
<properties isSystemResource="false"
isBlinking="false" isMapLayer="false" isHoverOn="false"
isVisible="false" />
isVisible="true" />
<resourceData xsi:type="lightningResourceData"
isUpdatingOnMetadataOnly="false" isRequeryNecessaryOnTimeMatch="true"
handlingPositiveStrikes="false" handlingNegativeStrikes="false"
handlingPulses="true">
handlingPositiveStrikes="true" handlingNegativeStrikes="true">
<binOffset posOffset="0" negOffset="3600" virtualOffset="0"/>
<metadataMap>
<mapping key="pluginName">

View file

@ -31,6 +31,9 @@
<contribute xsi:type="bundleItem" file="bundles/TotalLightningPlot5Min.xml"
menuText="5min plot" id="5MinLightningFlashPlot">
</contribute>
<contribute xsi:type="bundleItem" file="bundles/TotalLightningPlot1Min.xml"
menuText="1min plot" id="1MinLightningFlashPlot">
</contribute>
<contribute xsi:type="bundleItem" file="bundles/LightningSeq.xml"
menuText="1min Lgtng Seq Plot" id="1MinLightningFlashSeq">
</contribute>

View file

@ -70,5 +70,21 @@
menuText="5min pulse density" id="1HrGridLightningPulsePlot">
<substitute key="negOffset" value="300"/>
</contribute>
<contribute xsi:type="bundleItem" file="bundles/GridLightningCGPlot.xml"
menuText="1min cloud to ground density" id="1HrGridLightningCGPlot">
<substitute key="negOffset" value="60"/>
</contribute>
<contribute xsi:type="bundleItem" file="bundles/GridLightningCloudFlashPlot.xml"
menuText="1min cloud flash density" id="1HrGridLightningCloudFlashPlot">
<substitute key="negOffset" value="60"/>
</contribute>
<contribute xsi:type="bundleItem" file="bundles/GridLightningTotalFlashPlot.xml"
menuText="1min total flash density" id="1HrGridLightningFlashPlot">
<substitute key="negOffset" value="60"/>
</contribute>
<contribute xsi:type="bundleItem" file="bundles/GridLightningPulsePlot.xml"
menuText="1min pulse density" id="1HrGridLightningPulsePlot">
<substitute key="negOffset" value="60"/>
</contribute>
</menuTemplate>

View file

@ -39,12 +39,12 @@
<substitute key="source" value="GLD"/>
</contribute>
</contribute>
<contribute xsi:type="subMenu" menuText="Total Lightning" id="ENTLNSubMenu">
<contribute xsi:type="subMenu" menuText="ENI Total Lightning" id="ENTLNSubMenu">
<contribute xsi:type="subinclude" fileName="menus/lightning/entlnLightningBundleItems.xml">
<substitute key="source" value="ENTLN"/>
</contribute>
</contribute>
<contribute xsi:type="subMenu" menuText="Total Lightning Grid" id="entlnGridSubmenu">
<contribute xsi:type="subMenu" menuText="ENI Total Lightning Grid" id="entlnGridSubmenu">
<contribute xsi:type="subinclude" fileName="menus/lightning/gridTotalLightningMenuItems.xml">
<substitute key="source" value="ENTLN"/>
</contribute>

View file

@ -27,6 +27,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.measure.converter.UnitConverter;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import javax.measure.unit.Unit;
@ -52,12 +53,16 @@ import com.raytheon.uf.common.style.StyleException;
import com.raytheon.uf.common.style.image.ColorMapParameterFactory;
import com.raytheon.uf.common.style.image.DataScale;
import com.raytheon.uf.common.style.image.ImagePreferences;
import com.raytheon.uf.common.style.level.Level.LevelType;
import com.raytheon.uf.common.style.level.SingleLevel;
import com.raytheon.uf.common.time.BinOffset;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.cache.CacheObject;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.viz.grid.rsc.general.AbstractGridResource;
import com.raytheon.viz.grid.rsc.general.GeneralGridData;
import com.raytheon.viz.lightning.LightningResourceData.DisplayType;
import com.raytheon.viz.lightning.cache.LightningFrame;
import com.raytheon.viz.lightning.cache.LightningFrameMetadata;
import com.raytheon.viz.lightning.cache.LightningFrameRetriever;
@ -76,6 +81,7 @@ import com.raytheon.viz.lightning.cache.LightningFrameRetriever;
* Jul 28, 2014 3451 bclement uses intended range min
* Jul 29, 2014 3463 bclement uses sparse data source
* Mar 05, 2015 4233 bsteffen include source in cache key.
* Jul 02, 2015 4606 bclement added getDisplayParameterName()
*
* </pre>
*
@ -85,7 +91,13 @@ import com.raytheon.viz.lightning.cache.LightningFrameRetriever;
public class GridLightningResource extends
AbstractGridResource<GridLightningResourceData> {
public static final String DENSITY_PARAM = "lightning density";
public static final String DENSITY_PARAM = "Lightning Density";
private static final Unit<?> BIN_OFFSET_UNIT = SI.SECOND;
private static final Unit<?> TIME_PARAM_UNIT = NonSI.MINUTE;
private static final String TIME_PARAM_LABEL = "min";
private final Map<DataTime, CacheObject<LightningFrameMetadata, LightningFrame>> cacheObjectMap = new ConcurrentHashMap<>();
@ -107,7 +119,39 @@ public class GridLightningResource extends
@Override
public ParamLevelMatchCriteria getMatchCriteria() {
ParamLevelMatchCriteria rval = new ParamLevelMatchCriteria();
rval.setParameterName(Arrays.asList(DENSITY_PARAM));
GridLightningResourceData resourceData = getResourceData();
DisplayType type = resourceData.getDisplayType();
BinOffset offset = resourceData.getBinOffset();
String param = getDisplayParameterName(type, offset);
/* cave gets angry if there is ever more than one parameter here */
rval.setParameterName(Arrays.asList(param));
int resolution = resourceData.getKmResolution();
SingleLevel level = new SingleLevel(LevelType.DEFAULT);
level.setValue(resolution);
rval.setLevel(level);
return rval;
}
private static String getDisplayParameterName(DisplayType type,
BinOffset offset) {
String rval;
if (!type.equals(DisplayType.UNDEFINED)) {
StringBuilder sb = new StringBuilder();
sb.append(type.label).append(' ');
sb.append(DENSITY_PARAM).append(' ');
UnitConverter converter = BIN_OFFSET_UNIT
.getConverterTo(TIME_PARAM_UNIT);
double interval = converter.convert(offset.getInterval());
int timeLabel = (int) Math.round(interval);
sb.append(Integer.toString(timeLabel)).append(TIME_PARAM_LABEL);
rval = sb.toString();
} else {
/* if there isn't a display type defined, use the default param name */
rval = DENSITY_PARAM;
}
return rval;
}
@ -149,8 +193,7 @@ public class GridLightningResource extends
*/
rval = ColorMapParameterFactory.build(imgPrefs, Unit.ONE);
} catch (StyleException e) {
throw new VizException(
"Problem building lightning colormap"
throw new VizException("Problem building lightning colormap"
+ " parameters from image preferences", e);
}
} else {
@ -332,15 +375,13 @@ public class GridLightningResource extends
* @throws VizException
*/
private MathTransform getLonLatTransform(CoordinateReferenceSystem crs,
GeneralGridGeometry gridGeom)
throws VizException {
GeneralGridGeometry gridGeom) throws VizException {
try {
MathTransform latLonToCrs = MapUtil.getTransformFromLatLon(crs);
MathTransform crsToGrid = gridGeom.getGridToCRS(
PixelInCell.CELL_CENTER).inverse();
DefaultMathTransformFactory dmtf = new DefaultMathTransformFactory();
return dmtf.createConcatenatedTransform(
latLonToCrs, crsToGrid);
return dmtf.createConcatenatedTransform(latLonToCrs, crsToGrid);
} catch (Exception e) {
throw new VizException(
"Problem converting from lon/lat to requested grid geometry",

View file

@ -59,6 +59,7 @@ import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.DensityCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability;
import com.raytheon.viz.lightning.LightningResourceData.DisplayType;
import com.raytheon.viz.lightning.cache.LightningFrame;
import com.raytheon.viz.lightning.cache.LightningFrameMetadata;
import com.raytheon.viz.lightning.cache.LightningFrameRetriever;
@ -96,6 +97,8 @@ import com.raytheon.viz.lightning.cache.LightningFrameRetriever;
* Aug 19, 2014 3542 bclement fixed strike count clipping issue
* Mar 05, 2015 4233 bsteffen include source in cache key.
* Apr 09, 2015 4386 bclement added updateLightningFrames()
* Jul 01, 2015 4592 bclement cloud flashes are now points instead of circles
* Jul 01, 2015 4597 bclement reworked resource name using DisplayType
*
* </pre>
*
@ -209,26 +212,14 @@ public class LightningResource extends
} else {
rval = convertTimeIntervalToString(absTimeInterval);
}
if (resourceData.isExclusiveForType()) {
String modifier;
if (resourceData.isHandlingCloudFlashes()) {
modifier = "Cloud Flash ";
} else if (resourceData.isHandlingNegativeStrikes()) {
modifier = "Negative ";
} else if (resourceData.isHandlingPositiveStrikes()) {
modifier = "Positive ";
} else if (resourceData.isHandlingPulses()) {
modifier = "Pulse ";
} else {
/* space to preserve formatting */
modifier = " ";
}
rval += modifier;
DisplayType displayType = resourceData.getDisplayType();
if (!displayType.equals(DisplayType.UNDEFINED)) {
rval += displayType.label + ' ';
}
String source = resourceData.getSource();
if (source != null) {
rval += source + " ";
rval += source + ' ';
}
return rval;
}
@ -337,7 +328,7 @@ public class LightningResource extends
}
if (resourceData.isHandlingCloudFlashes()) {
cloudCount = drawFilteredPoints(target, magnification,
color, PointStyle.CIRCLE, extent, currCloudList);
color, PointStyle.POINT, extent, currCloudList);
}
if (resourceData.isHandlingPulses()) {
pulseCount = drawFilteredPoints(target, magnification,

View file

@ -46,9 +46,10 @@ import com.raytheon.uf.viz.core.rsc.LoadProperties;
* ------------ ---------- ----------- --------------------------
* Feb 18, 2009 chammack Initial creation
* Feb 27, 2013 DCS 152 jgerth Support for WWLLN and multiple sources
* Jun 19, 2014 3214 bclement added pulse and cloud flash support
* Jul 07, 2014 3333 bclement removed plotLightSource field
* Jun 19, 2014 3214 bclement added pulse and cloud flash support
* Jul 07, 2014 3333 bclement removed plotLightSource field
* Mar 05, 2015 4233 bsteffen include source in cache key.
* Jul 01, 2015 4597 bclement added DisplayType
* </pre>
*
* @author chammack
@ -59,6 +60,20 @@ public class LightningResourceData extends AbstractRequestableResourceData {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(LightningResourceData.class);
/*
* certain combination of lightning types get specific display labels
*/
public static enum DisplayType {
UNDEFINED(""), CLOUD_FLASH("Cloud Flash"), NEGATIVE("Negative"), POSITIVE(
"Positive"), PULSE("Pulse"), TOTAL_FLASH("Total"), CLOUD_TO_GROUND(
"Cloud to Ground");
public final String label;
private DisplayType(String name) {
this.label = name;
}
}
@XmlAttribute
private boolean handlingPositiveStrikes = true;
@ -73,7 +88,7 @@ public class LightningResourceData extends AbstractRequestableResourceData {
@XmlAttribute
private int countPosition = 0;
@Override
protected AbstractVizResource<?, ?> constructResource(
LoadProperties loadProperties, PluginDataObject[] objects) {
@ -97,8 +112,8 @@ public class LightningResourceData extends AbstractRequestableResourceData {
@Override
public boolean isUpdatingOnMetadataOnly() {
if (this.isUpdatingOnMetadataOnly == false)
return false;
if (this.isUpdatingOnMetadataOnly == false)
return false;
return true;
}
@ -159,32 +174,6 @@ public class LightningResourceData extends AbstractRequestableResourceData {
return handlingPulses;
}
/**
* @see #isHandlingCloudFlashes()
* @see #isHandlingNegativeStrikes()
* @see #isHandlingPositiveStrikes()
* @see #isHandlingPulses()
* @return true if resource data handles exactly one type of data
*/
public boolean isExclusiveForType() {
boolean[] bools = { isHandlingCloudFlashes(),
isHandlingNegativeStrikes(), isHandlingPositiveStrikes(),
isHandlingPulses() };
boolean handlingZero = true;
boolean handlingMoreThanOne = false;
for (boolean handlingSomething : bools) {
if (handlingSomething) {
if (handlingZero) {
handlingZero = false;
} else {
handlingMoreThanOne = true;
break;
}
}
}
return !handlingZero && !handlingMoreThanOne;
}
/**
* @param handlingPulses
* the handlingPulses to set
@ -194,11 +183,10 @@ public class LightningResourceData extends AbstractRequestableResourceData {
}
/**
* @return countPosition
* the countPosition to get - JJG
* @return countPosition the countPosition to get - JJG
*/
public int getCountPosition() {
return countPosition;
return countPosition;
}
/**
@ -218,6 +206,47 @@ public class LightningResourceData extends AbstractRequestableResourceData {
return null;
}
public DisplayType getDisplayType() {
DisplayType rval;
byte bitset = 0x00;
if (handlingCloudFlashes) {
bitset |= 0x01;
}
if (handlingNegativeStrikes) {
bitset |= 0x02;
}
if (handlingPositiveStrikes) {
bitset |= 0x04;
}
if (handlingPulses) {
bitset |= 0x08;
}
switch (bitset) {
case 0x01:
rval = DisplayType.CLOUD_FLASH;
break;
case 0x02:
rval = DisplayType.NEGATIVE;
break;
case 0x04:
rval = DisplayType.POSITIVE;
break;
case 0x06:
rval = DisplayType.CLOUD_TO_GROUND;
break;
case 0x07:
rval = DisplayType.TOTAL_FLASH;
break;
case 0x08:
rval = DisplayType.PULSE;
break;
default:
rval = DisplayType.UNDEFINED;
}
return rval;
}
/*
* (non-Javadoc)
*

View file

@ -22,6 +22,7 @@ import com.raytheon.viz.volumebrowser.vbui.VBMenuBarItemsMgr.ViewMenu;
* Dec 11, 2013 2602 bsteffen Remove ISerializableObject.
* Aug 14, 2014 3506 mapeters Added remove field and equals
* and hashCode functions.
* Jul 10, 2015 4641 mapeters Added toString().
*
* </pre>
*
@ -142,7 +143,6 @@ public class VbSource {
@Override
public boolean equals(Object that) {
if (that instanceof VbSource) {
if ((this.key.equals(((VbSource) that).getKey()) && (this
.getCategory().compareTo(((VbSource) that).getCategory()) == 0))) {
@ -156,6 +156,20 @@ public class VbSource {
public int hashCode() {
String newKey = key.concat(category);
return newKey.hashCode();
}
@Override
public String toString() {
StringBuilder sourceString = new StringBuilder("VbSource[");
sourceString.append("key=").append(key);
sourceString.append(", ");
sourceString.append("name=").append(name);
sourceString.append(", ");
sourceString.append("category=").append(category);
sourceString.append(", ");
sourceString.append("subCategory=").append(subCategory);
sourceString.append("]");
return sourceString.toString();
}
}

View file

@ -5,6 +5,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
@ -32,6 +33,9 @@ import com.raytheon.uf.common.menus.xml.CommonMenuContribution;
import com.raytheon.uf.common.menus.xml.CommonTitleImgContribution;
import com.raytheon.uf.common.menus.xml.CommonToolBarContribution;
import com.raytheon.uf.common.menus.xml.CommonToolbarSubmenuContribution;
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.viz.volumebrowser.vbui.VBMenuBarItemsMgr.ViewMenu;
/**
@ -51,6 +55,8 @@ import com.raytheon.viz.volumebrowser.vbui.VBMenuBarItemsMgr.ViewMenu;
* Aug 19, 2014 3506 mapeters Populate toolbar contributions from directory of
* source files instead of one file, merge sources from
* different localization levels instead of overriding.
* Jul 07, 2015 4641 mapeters Fix/improve comparators for VbSource sorting.
* Jul 10, 2015 4641 mapeters Added check for sources with null key/category fields.
*
* </pre>
*
@ -61,30 +67,88 @@ import com.raytheon.viz.volumebrowser.vbui.VBMenuBarItemsMgr.ViewMenu;
@XmlRootElement
public class VbSourceList {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(VbSourceList.class);
private final static IPathManager pm = PathManagerFactory.getPathManager();
/** The sources categories in order */
private static final String[] CATEGORIES = new String[] { "Volume",
"SfcGrid", "Local", "Point" };
/**
* Comparator for sorting sources (compares category, then subcategory, then
* name).
*/
private static Comparator<VbSource> comparator = new Comparator<VbSource>() {
/*
* For sorting sources, compare subcategories first. If they are the
* same or either source doesn't have one, compare display names.
*/
@Override
public int compare(VbSource source1, VbSource source2) {
String cat1 = source1.getCategory();
String cat2 = source2.getCategory();
if (!cat1.equals(cat2)) {
/*
* Categories are in the format
* "DropDownMenu/SubMenu/SubMenu/..."
*/
String[] cat1Parts = cat1.split("/");
String[] cat2Parts = cat2.split("/");
int minParts = Math.min(cat1Parts.length, cat2Parts.length);
for (int i = 0; i < minParts; i++) {
if (!cat1Parts[i].equals(cat2Parts[i])) {
/*
* Compare the drop down menu names differently to keep
* them in the order the NWS is used to.
*/
Comparator<String> comparator = (i == 0) ? categoryComparator
: stringComparator;
return comparator.compare(cat1Parts[i], cat2Parts[i]);
}
}
/*
* At this point, categories must match up to the end of the
* smaller of the two (e.g. SfcGrid and SfcGrid/RTOFS/forecast).
* Return the comparison of sourceWithShorterCategory's name and
* otherSource's next submenu level (RTOFS in the example).
*/
if (cat1Parts.length > minParts) {
return stringComparator.compare(cat1Parts[minParts],
source2.getName());
} else {
return stringComparator.compare(source1.getName(),
cat2Parts[minParts]);
}
}
/*
* Compare subcategories next. If one source has a subcategory and
* another doesn't, return the source with a subcategory as being
* larger (later in the list).
*/
String subCat1 = source1.getSubCategory();
String subCat2 = source2.getSubCategory();
if (subCat1 != null && subCat2 != null && !subCat1.equals(subCat2)) {
return comparatorString.compare(subCat1, subCat2);
if (subCat1 != null && subCat2 != null) {
if (!subCat1.equals(subCat2)) {
return stringComparator.compare(subCat1, subCat2);
}
} else if (subCat1 != null) {
return 1;
} else if (subCat2 != null) {
return -1;
}
return comparatorString.compare(source1.getName(),
// Compare names if categories and subcategories match.
return stringComparator.compare(source1.getName(),
source2.getName());
}
};
private static Comparator<String> comparatorString = new Comparator<String>() {
/*
* Compares two strings, ignoring capitalization and comparing numeric
* values.
*/
/**
* Comparator for comparing two strings, ignoring capitalization and
* comparing numeric values (assumes there are no leading zeros in the
* numeric values).
*/
private static Comparator<String> stringComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int n1 = s1.length();
@ -95,47 +159,54 @@ public class VbSourceList {
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
if (Character.isDigit(c1) && Character.isDigit(c2)) {
// Store aligned numeric values as strings
number1 += c1;
number2 += c2;
} else if (!number1.equals(number2)) {
if (Character.isDigit(c1)) {
/*
* Return first string as larger if it has
* longer/larger numeric value.
*/
return 1;
} else if (Character.isDigit(c2)) {
/*
* Return second string as larger if it has
* longer/larger numeric value.
*/
return -1;
} else {
/*
* Compare stored numeric values.
*/
return number1.charAt(0) - number2.charAt(0);
}
if (Character.isDigit(c1) && Character.isDigit(c2)) {
/*
* If aligned characters are both digits, store them as
* strings and proceed to next pair of aligned characters.
*/
number1 += c1;
number2 += c2;
continue;
} else if (!(Character.isDigit(c1) || Character.isDigit(c2))) {
/*
* If neither aligned character is a digit, return
* difference in stored numbers if they aren't equal,
* otherwise reset numbers if they aren't already empty.
*/
if (!number1.equals(number2)) {
return Integer.valueOf(number1)
- Integer.valueOf(number2);
} else if (!number1.isEmpty()) {
number1 = "";
number2 = "";
}
} else if (!number1.isEmpty()) {
/*
* Exactly one of the two characters must be a digit to
* reach here. If the numbers aren't empty, whichever string
* has the extra digit is larger as its number is larger.
*/
if (Character.isDigit(c1)) {
return 1;
} else {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
return -1;
}
}
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
/*
* If two strings end with numeric values after for loop, check for
* additional digits beyond minimum length to determine order.
* If two strings end with unequal numeric values after for loop,
* check for additional digits beyond minimum length to determine
* order.
*/
if (!number1.equals(number2)) {
if (n1 > n2 && Character.isDigit(s1.charAt(n2))) {
@ -143,16 +214,49 @@ public class VbSourceList {
} else if (n2 > n1 && Character.isDigit(s2.charAt(n1))) {
return -1;
} else
return number1.charAt(0) - number2.charAt(0);
return Integer.valueOf(number1) - Integer.valueOf(number2);
}
return n1 - n2;
}
};
/**
* Comparator for comparing the drop down menu names of the sources.
* Determines order based on {@link #CATEGORIES}.
*/
private static Comparator<String> categoryComparator = new Comparator<String>() {
@Override
public int compare(String cat1, String cat2) {
if (cat1.equals(cat2)) {
return 0;
}
for (String category : CATEGORIES) {
/*
* The categories aren't equal (checked for above), so whichever
* one appears first in the ordered categories list (CATEGORIES)
* should be returned as being smaller (making it also appear
* earlier in the sorted list of VbSources).
*/
if (cat1.equals(category)) {
return -1;
} else if (cat2.equals(category)) {
return 1;
}
}
/*
* If neither category is in the ordered list of expected
* categories, compare them alphabetically.
*/
return stringComparator.compare(cat1, cat2);
}
};
/**
* @deprecated This file path string exists only to support legacy overrides
* and should eventually be removed.
*/
@Deprecated
private final static String VB_SOURCE_FILE = "volumebrowser/VbSources.xml";
private final static char SUB_MENU_SPLIT = '/';
@ -257,6 +361,18 @@ public class VbSourceList {
List<VbSource> sources = JAXB.unmarshal(locFile.getFile(),
VbSourceList.class).getEntries();
if (sources != null) {
Iterator<VbSource> itr = sources.iterator();
while (itr.hasNext()) {
VbSource source = itr.next();
if (source.getCategory() == null
|| source.getKey() == null) {
statusHandler
.handle(Priority.WARN,
source
+ " was excluded from sources menu due to null key and/or category field.");
itr.remove();
}
}
allSources.addAll(sources);
}
}
@ -267,8 +383,11 @@ public class VbSourceList {
DatasetInfo info;
// Set containing sources to not be added to lists
Set<VbSource> removes = new HashSet<VbSource>();
for (int i = 0; i < allSources.size(); i++) {
VbSource source = allSources.get(i);
Iterator<VbSource> itr = allSources.iterator();
// The current index in allSources
int i = 0;
while (itr.hasNext()) {
VbSource source = itr.next();
// Set display names for sources
if (source.getName() == null) {
info = lookup.getInfo(source.getKey());
@ -277,11 +396,14 @@ public class VbSourceList {
if (source.getRemove()) {
// Add sources with remove tags to removal set and remove them.
removes.add(source);
allSources.remove(i--);
itr.remove();
} else if (removes.contains(source)
|| allSources.subList(0, i).contains(source)) {
// Remove sources in removal set and repeats
allSources.remove(i--);
itr.remove();
} else {
// Increment index in allSources if source wasn't removed
i++;
}
}
Collections.sort(allSources, comparator);

View file

@ -100,6 +100,7 @@ import com.raytheon.viz.warnings.DateUtil;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Polygon;
import com.vividsolutions.jts.geom.TopologyException;
import com.vividsolutions.jts.io.WKTReader;
/**
@ -148,6 +149,7 @@ import com.vividsolutions.jts.io.WKTReader;
* included tornado/severe thunderstorm watch message.
* Sep 18, 2014 ASM #15465 Qinglu Lin For backup, get officeShort and officeLoc from backup WFO's config.xml.
* May 7, 2015 ASM #17438 D. Friedman Clean up debug and performance logging.
* Jul 15, 2015 DR17716 mgamazaychikov Change to Geometry class in total intersection calculations.
* </pre>
*
* @author njensen
@ -331,7 +333,7 @@ public class TemplateRunner {
} else {
// Determine if one letter timezone is going to be
// put into timeZones.
Polygon[] poly1, poly2;
Geometry[] poly1, poly2;
int n1, n2;
double size, totalSize;
for (int i = 0; i < oneLetterTimeZones.length(); i++) {
@ -351,25 +353,32 @@ public class TemplateRunner {
if (intersectSize.get(oneLetterTZ[i]) != null) {
continue;
}
poly1 = new Polygon[warningArea
poly1 = new Geometry[warningArea
.getNumGeometries()];
n1 = warningArea.getNumGeometries();
for (int j = 0; j < n1; j++) {
poly1[j] = (Polygon) warningArea
poly1[j] = warningArea
.getGeometryN(j);
}
poly2 = new Polygon[timezoneGeom
poly2 = new Geometry[timezoneGeom
.getNumGeometries()];
n2 = timezoneGeom.getNumGeometries();
for (int j = 0; j < n2; j++) {
poly2[j] = (Polygon) timezoneGeom
poly2[j] = timezoneGeom
.getGeometryN(j);
}
// Calculate the total size of intersection
for (Polygon p1 : poly1) {
for (Polygon p2 : poly2) {
size = p1.intersection(p2)
.getArea();
for (Geometry p1 : poly1) {
for (Geometry p2 : poly2) {
try {
size = p1.intersection(p2)
.getArea();
} catch (TopologyException e) {
statusHandler
.handle(Priority.VERBOSE,
"Geometry error calculating the total size of intersection.",
e);
}
if (size > 0.0) {
totalSize += size;
}

View file

@ -57,6 +57,7 @@ import com.raytheon.viz.warngen.gis.AffectedAreas;
* Apr 29, 2014 3033 jsanchez Moved patterns into ICommonPatterns
* May 1, 2014 DR 16627 Qinglu Lin Added hasStateAbbrev(), isOtherType(), lockListOfNames(), and updated lock().
* May 13, 2014 DR 17177 Qinglu Lin Updated secondBullet().
* Jul 15, 2015 DR17716 mgamazaychikov Remove all nulls from the affectedAreas to avoid TimSort NPE in initialize.
*
* </pre>
*
@ -311,6 +312,8 @@ abstract public class AbstractLockingBehavior implements ICommonPatterns {
if (canceledAreas != null) {
this.affectedAreas.addAll(Arrays.asList(canceledAreas));
}
// remove all nulls from the collection to avoid TimSort NPE
this.affectedAreas.removeAll(Collections.singleton(null));
Collections.sort(this.affectedAreas, comparator);
}

View file

@ -26,6 +26,7 @@
# 05/07/2015 4027 randerso Migrated A1 OB9.16 code to A2
# 06/17/2015 4027 dgilling Perform case-insensitive
# comparisons in foundCTAs.
# 07/13/2015 4648 randerso Fix bullets in follow up products
#
#-------------------------------------------------------------------------
# Description: This product is a template for creating Hazard Products.
@ -707,21 +708,21 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis,
print "newBullets = ", newBullets
print "segment text is: ", segmentText
for bullet in newBullets:
if not "* " + bullet + "..." in segmentText:
if re.search("\* " + bullet + "\.\.\.", segmentText, flags=re.IGNORECASE) is None:
print bullet + " not in segmentText"
start = self._bulletOrder().index(bullet) + 1
end = len(self._bulletOrder())
bulletFlag = 1
for i in range(start,end):
if "* " + self._bulletOrder()[i] + "..." in segmentText and bulletFlag:
if (re.search("\* " + self._bulletOrder()[i] + "\.\.\.", segmentText, flags=re.IGNORECASE) is not None) and bulletFlag:
print "* " + self._bulletOrder()[i] + "... found!"
segmentTextSplit = string.split(segmentText,"* " + self._bulletOrder()[i] + "...")
segmentTextSplit = re.split("\* " + self._bulletOrder()[i] + "\.\.\.", segmentText, flags=re.IGNORECASE)
segmentText = string.join(segmentTextSplit,"* " + bullet + \
"...|* Enter bullet text *|\n\n* " + self._bulletOrder()[i] + "...")
bulletFlag = 0
if bulletFlag:
print "appending to bottom list of bullets!"
segmentTextSplit = string.split(segmentText,"Precautionary/preparedness actions...")
segmentTextSplit = re.split("Precautionary/preparedness actions\.\.\.", segmentText, flags=re.IGNORECASE)
segmentText = "\n" + string.join(segmentTextSplit,"* " + bullet + \
"...|* Enter bullet text *|\n\nPrecautionary/preparedness actions...")
bulletFlag = 0
@ -751,14 +752,14 @@ class TextProduct(TextRules.TextRules, SampleAnalysis.SampleAnalysis,
print "hazardBodyText info: removeBulletList: ",removeBulletList
# Finally remove the bullets no longer needed.
for bullet in removeBulletList:
if string.find(segmentText,"* "+ bullet + "...") != -1:
segmentTextSplit = string.split(segmentText,"* " + bullet + "...")
if re.search("\* "+ bullet + "\.\.\.", segmentText, flags=re.IGNORECASE) is not None:
segmentTextSplit = re.split("\* " + bullet + "\.\.\.", segmentText, flags=re.IGNORECASE)
print "segmentTextSplit is ", segmentTextSplit
segmentTextSplit2 = string.split(segmentTextSplit[1],"*",1)
if len(segmentTextSplit2) == 2:
segmentTextSplit[1] = "*" + segmentTextSplit2[1]
else:
segmentTextSplit2 = string.split(segmentTextSplit[1],"Precautionary/preparedness actions...",1)
segmentTextSplit2 = re.split("Precautionary/preparedness actions\.\.\.", segmentTextSplit[1], 1, flags=re.IGNORECASE)
if len(segmentTextSplit2) == 2:
segmentTextSplit[1] = "Precautionary/preparedness actions..." + segmentTextSplit2[1]
segmentText = string.join(segmentTextSplit,"")

View file

@ -1,4 +1,4 @@
# Version 2015.6.16-0
# Version 2015.7.22-0
import GenericHazards
import string, time, os, re, types, copy, LogStream, collections
@ -23,7 +23,7 @@ class TextProduct(HLSTCV_Common.TextProduct):
Definition["database"] = "Official" # Source database
Definition["debug"] = 1
Definition["mapNameForCombinations"] = "Zones_<site>"
Definition["defaultEditAreas"] = ""
Definition["defaultEditAreas"] = []
Definition["showZoneCombiner"] = 0 # 1 to cause zone combiner to display
Definition["productName"] = "Local Statement"
@ -1137,6 +1137,8 @@ class TextProduct(HLSTCV_Common.TextProduct):
statDict = statList[period]
for threatName in ['WindThreat', 'FloodingRainThreat', 'TornadoThreat']:
self._sampleRankedDiscreteValue(threatName, statDict)
# TODO: Investigate if this sampling method is still really needed. The JSON files may
# have all the needed information now
self._sampleMostSignificantDiscreteValue(threatName, statDict)
qpfToFfgRatio = self._getStatValue(statDict, "QPFtoFFGRatio", "Max")
@ -1183,7 +1185,6 @@ class TextProduct(HLSTCV_Common.TextProduct):
for period in range(len(statList)):
statDict = statList[period]
self._sampleRankedDiscreteValue('StormSurgeThreat', statDict)
self._sampleMostSignificantDiscreteValue('StormSurgeThreat', statDict)
inundationMax = self._getStatValue(statDict, "InundationMax", "Max")
decidingField = self._samplingDict['StormSurgeThreat']['decidingField']

View file

@ -1,4 +1,4 @@
# Version 2015.5.22-0
# Version 2015.7.23-0
import GenericHazards
import JsonSupport
@ -433,7 +433,6 @@ class TextProduct(HLSTCV_Common.TextProduct):
analysisList = [
("InundationMax", self.moderatedMax, [6]),
("InundationTiming", self.moderatedMax, [6]),
("StormSurgeThreat", self.mostSignificantDiscreteValue),
]
return analysisList
@ -1774,16 +1773,36 @@ class StormSurgeSection(SectionCommon):
summary + " storm surge possible")
def _peakSurge(self, segmentDict, productSegmentGroup, productSegment):
self._textProduct.debug_print("_peakSurge _inundationMax = %s" % (self._stats._inundationMax), 1)
if self._stats._inundationMax is not None and self._stats._inundationMax >= 1:
max = self._stats._inundationMax
max = round(self._stats._inundationMax)
self._stats._maxThreat = "None"
if max > 10:
maxRange = 4
self._stats._maxThreat = "Extreme"
elif max > 6:
maxRange = 3
elif max > 2:
if max >= 10:
self._stats._maxThreat = "Extreme"
else:
self._stats._maxThreat = "High"
elif max >= 3:
maxRange = 2
if max >= 4:
self._stats._maxThreat = "Mod"
else:
self._stats._maxThreat = "Elevated"
else:
maxRange = None
if max > 0:
self._stats._maxThreat = "Elevated"
self._textProduct.debug_print("_peakSurge maxRange = %s" % (maxRange), 1)
self._textProduct.debug_print("_peakSurge _maxThreat = %s" % (self._stats._maxThreat), 1)
# Save off the surge threat to the advisory
self._textProduct._currentAdvisory['ZoneData'][self._segment]["StormSurgeThreat"] = self._stats._maxThreat
if maxRange is not None:
words = str(int(max - maxRange)) + "-" + str(int(max)) + " feet above ground"
@ -2680,8 +2699,7 @@ class StormSurgeSectionStats(SectionCommonStats):
if phishEndTime is None:
phishEndTime = tr.startTime()
self._updateThreatStats(tr, statDict, "StormSurgeThreat")
self._windowSurge = "Window of concern: "
@ -2720,7 +2738,6 @@ class StormSurgeSectionStats(SectionCommonStats):
else:
self._windowSurge += "through " + endTimeDescriptor
self._currentAdvisory["StormSurgeThreat"] = self._maxThreat
if self._inundationMax is not None:
# Round so we don't store values like 1.600000023841858
self._currentAdvisory["StormSurgeForecast"] = \
@ -2751,10 +2768,6 @@ class StormSurgeSectionStats(SectionCommonStats):
# Inundation timing - only applies if any inundation forecast
if self._inundationMax >= 1 and self._onsetSurgeHour is None:
missingGridsList.append("InundationTiming")
# Threat grid
if self._maxThreat is None:
missingGridsList.append("StormSurgeThreat")
# If there are any missing grids - let the user know
if len(missingGridsList) > 0:

View file

@ -21,18 +21,330 @@
<styleRuleset>
<styleRule>
<paramLevelMatches>
<parameter>lightning density</parameter>
<parameter>Lightning Density</parameter>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LOG">
<minValue>0.5</minValue>
<maxValue>30000</maxValue>
</range>
<range scale="LOG">
<minValue>0.5</minValue>
<maxValue>30000</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 3 10 30 100 300 1000 3000 10000 30000</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud to Ground Lightning Density 1min</parameter>
<parameter>Cloud Flash Lightning Density 1min</parameter>
<parameter>Total Lightning Density 1min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>50</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 10 20 30 40 50</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud to Ground Lightning Density 5min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>50</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 10 20 30 40 50</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud to Ground Lightning Density 15min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>50</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 10 20 30 40 50</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud Flash Lightning Density 5min</parameter>
<parameter>Total Lightning Density 5min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>100</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 20 40 60 80 100</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud to Ground Lightning Density 60min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>200</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 25 50 75 100 125 150 175 200</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud to Ground Lightning Density 1min</parameter>
<parameter>Cloud to Ground Lightning Density 5min</parameter>
<parameter>Cloud to Ground Lightning Density 15min</parameter>
<parameter>Cloud to Ground Lightning Density 60min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>20</lower>
<upper>40</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>200</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 25 50 75 100 125 150 175 200</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud Flash Lightning Density 15min</parameter>
<parameter>Cloud Flash Lightning Density 60min</parameter>
<parameter>Total Lightning Density 15min</parameter>
<parameter>Total Lightning Density 60min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>300</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 50 100 150 200 250 300</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud Flash Lightning Density 1min</parameter>
<parameter>Cloud Flash Lightning Density 5min</parameter>
<parameter>Cloud Flash Lightning Density 15min</parameter>
<parameter>Total Lightning Density 1min</parameter>
<parameter>Total Lightning Density 5min</parameter>
<parameter>Total Lightning Density 15min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>20</lower>
<upper>40</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>300</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 50 100 150 200 250 300</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Pulse Lightning Density 1min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>500</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 100 200 300 400 500</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Pulse Lightning Density 5min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>750</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 100 200 300 400 500 600 700</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Pulse Lightning Density 15min</parameter>
<parameter>Pulse Lightning Density 60min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>1</lower>
<upper>8</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>3000</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 500 1000 1500 2000 2500 3000</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Pulse Lightning Density 1min</parameter>
<parameter>Pulse Lightning Density 5min</parameter>
<parameter>Pulse Lightning Density 15min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>20</lower>
<upper>40</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>3000</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 500 1000 1500 2000 2500 3000</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Cloud Flash Lightning Density 60min</parameter>
<parameter>Total Lightning Density 60min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>20</lower>
<upper>40</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>3000</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 500 1000 1500 2000 2500 3000</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>Pulse Lightning Density 60min</parameter>
<!-- level is km resolution -->
<rangeLevel units="DEFAULT">
<lower>20</lower>
<upper>40</upper>
</rangeLevel>
</paramLevelMatches>
<imageStyle>
<interpolate>false</interpolate>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>25000</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<values>1 5000 10000 15000 20000 25000</values>
</colorbarLabeling>
</imageStyle>
</styleRule>
</styleRuleset>

View file

@ -335,7 +335,7 @@ VTECTable = {
upgradeHazardsDict = {
'WC.W': ['WC.A', 'WC.Y'],
'WC.Y': ['WC.A'],
'BZ.W': ['WS.W', 'LE.W', 'WW.Y','ZR.Y', 'LE.Y',
'BZ.W': ['WS.W', 'LE.W', 'ZR.Y', 'LE.Y', 'WW.Y',
'BZ.A', 'WS.A', 'LE.A'],
'IS.W': ['WS.W', 'LE.W', 'ZR.Y', 'LE.Y', 'WW.Y',
'BZ.A', 'WS.A', 'LE.A'],

View file

@ -101,6 +101,7 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger;
* 10/28/2014 3454 bphillip Fix usage of getSession()
* Jan 27, 2015 4031 rferrel Resolve AFOS PILs site conflict using preferredAfosFirstLetter.
* May 05, 2015 4462 rferrel {@link #write(StdTextProduct)} when missing set the textProduct's site.
* Jul 06, 2015 4612 rferrel Get all sites matching the preferredafosFirstLetter.
* </pre>
*
* @author garmendariz
@ -132,7 +133,7 @@ public class StdTextProductDao extends CoreDao {
private static final String NNN_ID = "nnnid";
private static final String SITE = "site";
private static final String SITES = "sites";
private static final String PRODUCT = "product";
@ -161,7 +162,7 @@ public class StdTextProductDao extends CoreDao {
+ " and " + ProdXXX_ID + " = :" + XXX_ID
+ " and " + ProdSITE + " = :" + SITE
+ " and " + ProdSITE + " in (:" + SITES + ")"
+ " order by " + REFTIME + " desc" + ", " + INSERTTIME + " desc";
@ -309,7 +310,7 @@ public class StdTextProductDao extends CoreDao {
List<StdTextProduct> products = null;
try {
final List<Pair<String, AFOSProductId>> siteAfosIdList = querySiteAfosId(
final List<Pair<String[], AFOSProductId>> siteAfosIdList = querySiteAfosId(
ccc, nnn, xxx);
products = txTemplate
@ -337,14 +338,14 @@ public class StdTextProductDao extends CoreDao {
query.setMaxResults(version + 1);
}
for (Pair<String, AFOSProductId> siteAfosId : siteAfosIdList) {
String site = siteAfosId.getFirst();
for (Pair<String[], AFOSProductId> siteAfosId : siteAfosIdList) {
String[] sites = siteAfosId.getFirst();
AFOSProductId afosId = siteAfosId.getSecond();
if (site != null) {
if (sites != null) {
query.setParameter(CCC_ID, afosId.getCcc());
query.setParameter(NNN_ID, afosId.getNnn());
query.setParameter(XXX_ID, afosId.getXxx());
query.setParameter(SITE, site);
query.setParameterList(SITES, sites);
List<?> results = query.list();
if (results != null && results.size() > 0) {
@ -387,15 +388,15 @@ public class StdTextProductDao extends CoreDao {
}
/**
* Get desired site for the afosId the pairs are order by AfosId.
* Get desired sites for the afosId the pairs are order by AfosId.
*
* @param ccc
* @param nnn
* @param xxx
* @return siteAfosIds
*/
private List<Pair<String, AFOSProductId>> querySiteAfosId(final String ccc,
final String nnn, final String xxx) {
private List<Pair<String[], AFOSProductId>> querySiteAfosId(
final String ccc, final String nnn, final String xxx) {
boolean hasCCC = ((ccc != null) && (ccc.length() > 0) && (!ccc
.equals("000")));
boolean hasNNN = ((nnn != null) && (nnn.length() > 0) && (!nnn
@ -405,10 +406,10 @@ public class StdTextProductDao extends CoreDao {
final boolean createInitialFilter = !(hasCCC && hasNNN && hasXXX);
return txTemplate
.execute(new TransactionCallback<List<Pair<String, AFOSProductId>>>() {
.execute(new TransactionCallback<List<Pair<String[], AFOSProductId>>>() {
@Override
public List<Pair<String, AFOSProductId>> doInTransaction(
public List<Pair<String[], AFOSProductId>> doInTransaction(
TransactionStatus status) {
String paddedccc = StringUtils.rightPad(ccc,
MAX_FIELD_LENGTH);
@ -417,7 +418,7 @@ public class StdTextProductDao extends CoreDao {
String paddedxxx = StringUtils.rightPad(xxx,
MAX_FIELD_LENGTH);
Session session = getCurrentSession();
List<Pair<String, AFOSProductId>> siteProductPairList = null;
List<Pair<String[], AFOSProductId>> siteProductPairList = null;
StdTextProduct stdTextProduct = getStdTextProductInstance();
if (createInitialFilter) {
@ -472,30 +473,30 @@ public class StdTextProductDao extends CoreDao {
.keySet());
Collections.sort(indices);
for (int index : indices) {
String site = getSite(siteMap.get(index)
String[] sites = getSite(siteMap.get(index)
.toArray());
AFOSProductId afosId = orderedAfosIds
.get(index);
Pair<String, AFOSProductId> pair = new Pair<String, AFOSProductId>(
site, afosId);
siteProductPairList.add(pair);
siteProductPairList
.add(new Pair<String[], AFOSProductId>(
sites, afosId));
}
} else {
siteProductPairList = new ArrayList<Pair<String, AFOSProductId>>(
siteProductPairList = new ArrayList<Pair<String[], AFOSProductId>>(
0);
}
} else {
AFOSProductId afosId = new AFOSProductId(paddedccc,
paddednnn, paddedxxx);
String site = getSite(afosId);
if (site == null) {
siteProductPairList = new ArrayList<Pair<String, AFOSProductId>>(
String[] sites = getSite(afosId);
if (sites == null) {
siteProductPairList = new ArrayList<Pair<String[], AFOSProductId>>(
0);
} else {
siteProductPairList = new ArrayList<>(1);
siteProductPairList
.add(new Pair<String, AFOSProductId>(
site, afosId));
.add(new Pair<String[], AFOSProductId>(
sites, afosId));
}
}
return siteProductPairList;
@ -504,12 +505,12 @@ public class StdTextProductDao extends CoreDao {
}
/**
* Get site based on the ordering from preferredAfosFirstLetter.
* Get sites based on the ordering from preferredAfosFirstLetter.
*
* @param afosId
* @return site or null when no data.
* @return sites or null when no data.
*/
private String getSite(AFOSProductId afosId) {
private String[] getSite(AFOSProductId afosId) {
String ccc = afosId.getCcc();
String nnn = afosId.getNnn();
String xxx = afosId.getXxx();
@ -534,17 +535,18 @@ public class StdTextProductDao extends CoreDao {
}
/**
* From the array of sites determine which one is the preferred site.
* From the array of sites determine which ones are preferred sites.
*
* @param values
* - Assume sites with common afosId
* @return site first site based on preferredAfosFirstLetter
* @return sites based on preferredAfosFirstLetter
*/
private String getSite(Object[] values) {
private String[] getSite(Object[] values) {
if (values != null) {
if (values.length == 1) {
return (String) values[0];
return new String[] { (String) values[0] };
} else if (values.length > 1) {
List<String> results = new ArrayList<>(values.length);
String[] sites = new String[values.length];
for (int i = 0; i < values.length; ++i) {
sites[i] = (String) values[i];
@ -552,17 +554,20 @@ public class StdTextProductDao extends CoreDao {
for (char c : preferredAfosFirstLetter) {
for (String site : sites) {
if (site.charAt(0) == c) {
return site;
results.add(site);
}
}
if (!results.isEmpty()) {
return results.toArray(new String[results.size()]);
}
}
if (logger.isInfoEnabled()) {
String message = "None of the sites first character in preferred AFOS first letter list \""
+ new String(preferredAfosFirstLetter)
+ "\". Using site: " + sites[0];
+ "\". Using sites: " + sites;
logger.info(message);
}
return sites[0];
return sites;
}
}
return null;
@ -586,7 +591,7 @@ public class StdTextProductDao extends CoreDao {
Session session = null;
try {
List<Pair<String, AFOSProductId>> siteAfosIdList = querySiteAfosId(
List<Pair<String[], AFOSProductId>> siteAfosIdList = querySiteAfosId(
ccc, nnn, xxx);
session = getSession();
@ -640,7 +645,7 @@ public class StdTextProductDao extends CoreDao {
Session session = null;
try {
List<Pair<String, AFOSProductId>> siteAfosIdList = querySiteAfosId(
List<Pair<String[], AFOSProductId>> siteAfosIdList = querySiteAfosId(
ccc, nnn, xxx);
session = getSession();
@ -687,7 +692,7 @@ public class StdTextProductDao extends CoreDao {
* @throws HibernateException
*/
private List<StdTextProduct> listProducts(Criteria criteria,
List<Pair<String, AFOSProductId>> siteAfosIdList)
List<Pair<String[], AFOSProductId>> siteAfosIdList)
throws HibernateException {
List<?> prodList = criteria.list();
@ -699,9 +704,9 @@ public class StdTextProductDao extends CoreDao {
products = new ArrayList<>(prodList.size());
Iterator<?> iter = prodList.iterator();
Iterator<Pair<String, AFOSProductId>> siteAfosIdIter = siteAfosIdList
Iterator<Pair<String[], AFOSProductId>> siteAfosIdIter = siteAfosIdList
.iterator();
Pair<String, AFOSProductId> pair = siteAfosIdIter.next();
Pair<String[], AFOSProductId> pair = siteAfosIdIter.next();
while (iter.hasNext()) {
StdTextProduct prod = (StdTextProduct) iter.next();
@ -715,8 +720,11 @@ public class StdTextProductDao extends CoreDao {
pair = siteAfosIdIter.next();
}
String site = prod.getSite();
if (site.equals(pair.getFirst())) {
products.add(prod);
for (String pSite : pair.getFirst()) {
if (site.equals(pSite)) {
products.add(prod);
break;
}
}
}
}

View file

@ -121,7 +121,7 @@ public class FaxSender {
faxWriter.write("\n");
faxWriter.close();
StringBuilder faxDataCommand = new StringBuilder();
faxDataCommand.append("scp ");
faxDataCommand.append("scp -q ");
faxDataCommand.append(faxDataFilename);
faxDataCommand.append(" ldad@ls1:");
faxDataCommand.append(ldadDataFilename);
@ -136,7 +136,7 @@ public class FaxSender {
return retval;
}
StringBuilder ldadDataCommand = new StringBuilder();
ldadDataCommand.append("scp ");
ldadDataCommand.append("scp -q ");
ldadDataCommand.append(faxScriptFilename);
ldadDataCommand.append(" ldad@ls1:");
ldadDataCommand.append(ldadScriptFilename);