Merge branch 'omaha_13.5.2' (13.5.2-2) into development

Conflicts:
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/DPD/IR2.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/FYC/IR.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/FYC/VIS.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/IR13.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_11.03.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_14.06.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_3.98.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_4.45.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_6.51.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_7.02.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_7.43.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_VIS.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_DMSP/IR.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_DMSP/VIS.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_DMSP/WV.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES12/default.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/IR.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/IR13.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_11.03.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_14.06.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_3.98.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_4.45.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_6.51.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_7.02.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_7.43.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/SND_VIS.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/VIS.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/WV.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GINI_GOES14/default.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GMS/IR.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GMS/WV.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GOES10/WV.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GOES14/IR.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GOES14/IR2.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GOES14/VIS.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/GOES14/WV.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/Global/IR.attr
	cave/build/static/common/cave/etc/ncep/ResourceDefns/SATELLITE/Global/WV.attr
	cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/AbstractAWTFont.java
	cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/AbstractGriddedDisplay.java
	cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/general/GeneralGridData.java
	cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/dialogs/TextEditorDialog.java
	edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/RemapGrid.java
	edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/jaxb/SerializationContextFactory.java
	edexOsgi/com.raytheon.uf.edex.wfs/com.raytheon.uf.edex.wfs.ecl
	msi/VizLauncher/VizLauncher.suo
	msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/AbstractProcessLauncher.cs
	msi/build/A2Staging/VisualStudio/VizLauncher.exe
	msi/build/A2Staging/VisualStudio/_DELETE_ME_
	ncep/gov.noaa.nws.ncep.common.dataplugin.aww/src/gov/noaa/nws/ncep/common/dataplugin/aww/AwwRecord.java
	ncep/gov.noaa.nws.ncep.common.dataplugin.geomag/src/gov/noaa/nws/ncep/common/dataplugin/geomag/GeoMagRecord.java
	ncep/gov.noaa.nws.ncep.common.dataplugin.gpd/gov.noaa.nws.ncep.common.dataplugin.gpd.ecl
	ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/AwwDecoder.java
	ncep/gov.noaa.nws.ncep.edex.plugin.geomag/META-INF/MANIFEST.MF
	ncep/gov.noaa.nws.ncep.edex.plugin.geomag/src/gov/noaa/nws/ncep/edex/plugin/geomag/GeoMagDecoder.java
	ncep/gov.noaa.nws.ncep.edex.plugin.mcidas/src/gov/noaa/nws/ncep/edex/plugin/mcidas/decoder/McidasDecoder.java
	ncep/gov.noaa.nws.ncep.edex.plugin.stormtrack/src/gov/noaa/nws/ncep/edex/plugin/stormtrack/decoder/StormTrackDecoder.java
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/DPD/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/FYC/FYC.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/FYC/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/FYC/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/FYC/SW.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/FYC/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Composite/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/GINI_DMSP.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_DMSP/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/GINI_ERS-QuickSCAT-Scatterometer.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_ERS-QuickSCAT-Scatterometer/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/GINI_GMS.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GMS/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES11/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES12/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES13/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES15/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/GINI_GOES7.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES7/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/GINI_GOES8.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES8/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/GINI_GOES9.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_GOES9/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/GINI_JERS.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_JERS/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/GINI_METEOSAT.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_METEOSAT/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_Miscellaneous/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/GINI_NOAA16.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA16/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/GINI_NOAA17.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA17/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/GINI_NOAA18.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA18/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/GINI_NOAA19.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/RAIN_RATE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_NOAA19/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/CLOUD_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/DERIVED_CAPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/DERIVED_CONV_INH.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/DERIVED_LAND_SEA_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/DERIVED_VOLCANO_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/DERIVED_WINDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/DMPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/GRID_CLOUD_AMT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/GRID_CTOP_PRES_HGHT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/ICE_CONC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/ICE_EDGE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/ICE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/IMG_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/IMG_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/IMG_SRFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/IR13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/LOW_CLOUD_IMG.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/MDPI.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/NORMAL_TPW_PERCENT.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/POLAR_3.7u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/POLAR_3.9u.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/POLAR_IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/POLAR_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SCATTEROMETER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SFC_WETNESS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SFC_WIND_SPD.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_11.03.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_12.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_12.66.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_13.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_13.64.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_14.06.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_14.37.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_14.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_3.74.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_3.98.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_4.13.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_4.45.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_4.52.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_4.57.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_6.51.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_7.02.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_7.43.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_9.71.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_LIFTED_INDEX.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_PRECIP_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_SFC_SKIN_TEMP.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SND_VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SNOW_IND.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SNOW_WATER.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/SURFACE_TYPE.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GINI_POES-NPOESS/default.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GMS/GMS.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GMS/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GMS/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GMS/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GMS/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GMS/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/GOES10.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES10/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/GOES11.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES11/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES12/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES12/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES13/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES13/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES15/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES15/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES6/GOES6.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES6/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES6/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES6/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES7/GOES7.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES7/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES7/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES7/VISPC.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES7/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/GOES8.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES8/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/GOES9.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/IR2.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/IR4.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/GOES9/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/HRVIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/IR_12.0.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/IR_8.7.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/NIR_1.6.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/VIS_0.8.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT10/WV_7.3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT3/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT3/METEOSAT3.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT3/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT3/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT5/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT5/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT5/METEOSAT5.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT5/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT5/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT6/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT6/METEOSAT6.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT6/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT6/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT7/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT7/IR3.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT7/METEOSAT7.xml
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT7/VIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT7/WV.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/HRVIS.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/IR.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/IR_12.0.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/IR_8.7.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/NIR_1.6.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/VIS_0.8.attr
	ncep/gov.noaa.nws.ncep.viz.localization/localization/ncep/ResourceDefns/SATELLITE/METEOSAT9/WV_7.3.attr
	ncep/gov.noaa.nws.ncep.viz.rsc.ffa/META-INF/MANIFEST.MF
	ncep/gov.noaa.nws.ncep.viz.rsc.wtch/META-INF/MANIFEST.MF

Former-commit-id: efae0435f1f12b8e90979a03da9a96a1e1cf600e
This commit is contained in:
Richard Peter 2013-09-03 17:39:11 -05:00
commit d855012cdb
1688 changed files with 40056 additions and 24898 deletions

View file

@ -37,15 +37,12 @@ import org.geotools.coverage.grid.GeneralGridEnvelope;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeneralDerivedCRS;
import org.opengis.referencing.datum.PixelInCell;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.geospatial.TransformFactory;
import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
@ -718,18 +715,9 @@ public abstract class AbstractDescriptor extends ResourceGroup implements
protected void setupTransforms() throws Exception {
GeneralGridGeometry gridGeometry = getGridGeometry();
MathTransform worldToCRS = getWorldToCRSTransform(gridGeometry);
if (worldToCRS != null) {
MathTransform crsToPixel = gridGeometry.getGridToCRS(
PixelInCell.CELL_CENTER).inverse();
worldToPixel = new DefaultMathTransformFactory()
.createConcatenatedTransform(worldToCRS, crsToPixel);
pixelToWorld = worldToPixel.inverse();
} else {
pixelToWorld = null;
worldToPixel = null;
}
worldToPixel = TransformFactory.worldToGrid(gridGeometry,
PixelInCell.CELL_CENTER);
pixelToWorld = (worldToPixel != null ? worldToPixel.inverse() : null);
}
/*
@ -869,28 +857,4 @@ public abstract class AbstractDescriptor extends ResourceGroup implements
false), envelope);
}
/**
* Get the world to CRS transform used for {@link #worldToPixel(double[])}
* and {@link #pixelToWorld(double[])}
*
* @param gridGeometry
* @return The world to gridGeometry CRS transform or null if there is none
*/
public static MathTransform getWorldToCRSTransform(
GeneralGridGeometry gridGeometry) {
CoordinateReferenceSystem crs = gridGeometry.getEnvelope()
.getCoordinateReferenceSystem();
if (crs instanceof GeneralDerivedCRS) {
GeneralDerivedCRS projCRS = (GeneralDerivedCRS) crs;
CoordinateReferenceSystem worldCRS = projCRS.getBaseCRS();
try {
return CRS.findMathTransform(worldCRS, crs);
} catch (FactoryException e) {
statusHandler.handle(Priority.PROBLEM,
"Error setting up Math Transforms,"
+ " this descriptor may not work properly", e);
}
}
return null;
}
}

View file

@ -42,6 +42,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.SimulatedTime;
import com.raytheon.uf.viz.core.AbstractTimeMatcher;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.VizConstants;
import com.raytheon.uf.viz.core.comm.PerspectiveSpecificLoadProperties;
@ -229,8 +230,10 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
@Override
public void redoTimeMatching(IDescriptor descriptor) throws VizException {
synchronized (this) {
if (timeMatchBasis != null && ! validateTimeMatchBasis(descriptor.getResourceList()))
timeMatchBasis = null;
if (timeMatchBasis != null && timeMatchBasis.getDescriptor() == descriptor &&
! validateTimeMatchBasis(descriptor)) {
changeTimeMatchBasis(null);
}
if (timeMatchBasis != null) {
IDescriptor tmDescriptor = timeMatchBasis.getDescriptor();
if (tmDescriptor != null) {
@ -1053,6 +1056,33 @@ public class D2DTimeMatcher extends AbstractTimeMatcher {
configFactory.resetMultiload();
}
private boolean validateTimeMatchBasis(IDescriptor descriptor ) {
/*
* If a resource is shared by multiple panels (this can be the case with
* tools, at least), then it is necessary to search all of them as
* resource.descriptor() may not contain resource. TODO: Don't allow
* this condition to occur?
*/
IRenderableDisplay display = descriptor.getRenderableDisplay();
IDisplayPaneContainer container = display != null ?
display.getContainer() : null;
if (container != null) {
for (IDisplayPane pane : container.getDisplayPanes()) {
IRenderableDisplay paneDisplay = pane.getRenderableDisplay();
IDescriptor paneDescriptor = paneDisplay != null ?
paneDisplay.getDescriptor() : null;
if (paneDescriptor != null
&& validateTimeMatchBasis(paneDescriptor
.getResourceList())) {
return true;
}
}
} else {
return validateTimeMatchBasis(descriptor.getResourceList());
}
return false;
}
private boolean validateTimeMatchBasis(ResourceList list) {
for (ResourcePair rp : list) {
AbstractVizResource<?, ?> rsc = rp.getResource();

View file

@ -57,15 +57,17 @@ import de.micromata.opengis.kml.v_2_2_0.Style;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 1, 2012 bsteffen Initial creation
* Jun 1, 2012 bsteffen Initial creation
* Aug 27, 2013 #2287 randerso Removed 180 degree adjustment required by error
* in Maputil.rotation
*
* </pre>
*
* @author bsteffen
* @version 1.0
*/
public class KmlPointImageExtension extends GraphicsExtension<KmlGraphicsTarget>
implements IPointImageExtension {
public class KmlPointImageExtension extends
GraphicsExtension<KmlGraphicsTarget> implements IPointImageExtension {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(KmlRasterImageExtension.class);
@ -113,7 +115,7 @@ public class KmlPointImageExtension extends GraphicsExtension<KmlGraphicsTarget>
IconStyle iconStyle = style.createAndSetIconStyle();
iconStyle.setScale(options.getPlotIconScale());
double heading = 180 + MapUtil.rotation(
double heading = MapUtil.rotation(
new com.vividsolutions.jts.geom.Coordinate(loc
.getLongitude(), loc.getLatitude()),
gridGeometry);

View file

@ -233,4 +233,11 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.common.dataplugin.gpd"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View file

@ -107,13 +107,6 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.ffa"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.ffg"
download-size="0"
@ -205,27 +198,6 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.svrl"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.warn"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.wcn"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.wcp"
download-size="0"
@ -233,13 +205,6 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.wstm"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.tools"
download-size="0"
@ -262,7 +227,7 @@
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.wou"
id="gov.noaa.nws.ncep.viz.rsc.aww"
download-size="0"
install-size="0"
version="0.0.0"
@ -289,13 +254,6 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.wtch"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.rsc.ncradar"
download-size="0"
@ -356,4 +314,11 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.viz.timeseries"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View file

@ -79,6 +79,7 @@ import com.raytheon.uf.viz.core.style.VizStyleException;
import com.raytheon.uf.viz.core.style.level.SingleLevel;
import com.raytheon.viz.core.contours.rsc.displays.GriddedContourDisplay;
import com.raytheon.viz.core.contours.rsc.displays.GriddedVectorDisplay;
import com.raytheon.viz.core.contours.util.VectorGraphicsRenderableFactory;
import com.raytheon.viz.core.drawables.ColorMapParameterFactory;
import com.raytheon.viz.core.rsc.displays.GriddedImageDisplay;
import com.raytheon.viz.core.rsc.displays.GriddedImageDisplay.GriddedImagePaintProperties;
@ -93,8 +94,10 @@ import com.vividsolutions.jts.geom.Coordinate;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Nov 5, 2009 randerso Initial creation
* Jan 8, 2010 4205 jelkins add equals checking for OA resources
* Nov 5, 2009 randerso Initial creation
* Jan 8, 2010 4205 jelkins add equals checking for OA resources
* Aug 27, 2013 2287 randerso Added new parameters to GriddedVectorDisplay
* constructor
*
* </pre>
*
@ -424,9 +427,10 @@ public class OAResource extends
FloatBuffer mag = data;
data.position(transformer.getNx() * transformer.getNy());
FloatBuffer dir = data.slice();
VectorGraphicsRenderableFactory factory = new VectorGraphicsRenderableFactory();
GriddedVectorDisplay vector = new GriddedVectorDisplay(mag,
dir, descriptor, transformer.getGridGeom(), 80,
displayType);
dir, descriptor, transformer.getGridGeom(), 80, 0.75,
true, displayType, factory);
renderableMap.put(dataTime, vector);
break;

View file

@ -55,6 +55,7 @@ import com.raytheon.viz.aviation.monitor.AvnPyUtil;
* Nov 11, 2012 1298 rferrel Non-blocking dialog discovered problem
* adding dispose listener when not on the
* UI thread.
* Aug 26, 2013 #2283 lvenable Cleaned up some synchronized code.
*
* </pre>
*
@ -200,7 +201,7 @@ public class PythonCacheGuidanceJob extends
*
* @param req
*/
private synchronized void waitAdd(CacheGuidanceRequest req) {
private void waitAdd(CacheGuidanceRequest req) {
synchronized (waitMonitor) {
if (waitList.contains(req) == false) {
waitList.add(req);
@ -213,7 +214,7 @@ public class PythonCacheGuidanceJob extends
*
* @param req
*/
private synchronized void waitRemove(CacheGuidanceRequest req) {
private void waitRemove(CacheGuidanceRequest req) {
synchronized (waitMonitor) {
waitList.remove(req);
waitMonitor.notify();
@ -286,11 +287,13 @@ public class PythonCacheGuidanceJob extends
* - Unique tag
* @return siteObj
*/
public synchronized String getSiteObj(String siteID, String tag) {
public String getSiteObj(String siteID, String tag) {
String siteObj = null;
Map<String, String> siteObjs = siteObjMaps.get(siteID);
if (siteObjs != null) {
siteObj = siteObjs.get(tag);
synchronized (siteObjMaps) {
Map<String, String> siteObjs = siteObjMaps.get(siteID);
if (siteObjs != null) {
siteObj = siteObjs.get(tag);
}
}
return siteObj;
}
@ -303,10 +306,12 @@ public class PythonCacheGuidanceJob extends
* @param tag
* - Unique tag
*/
private synchronized void clearSiteObj(String siteID, String tag) {
private void clearSiteObj(String siteID, String tag) {
Map<String, String> siteObjs = siteObjMaps.get(siteID);
if (siteObjs != null) {
siteObjs.remove(tag);
synchronized (siteObjMaps) {
if (siteObjs != null) {
siteObjs.remove(tag);
}
}
}
@ -317,7 +322,7 @@ public class PythonCacheGuidanceJob extends
* A map with key of stites an array of tags to clear for the
* site
*/
public synchronized void clearSiteObjs(Map<String, ArrayList<String>> tags) {
public void clearSiteObjs(Map<String, ArrayList<String>> tags) {
for (Object s : tags.keySet().toArray()) {
String siteID = s.toString();
for (String tag : tags.get(siteID)) {
@ -336,14 +341,15 @@ public class PythonCacheGuidanceJob extends
* @param siteObj
* - Pickle string to cache
*/
private synchronized void setSiteObj(String siteID, String tag,
String siteObj) {
Map<String, String> siteObjs = siteObjMaps.get(siteID);
if (siteObjs == null) {
siteObjs = new HashMap<String, String>();
siteObjMaps.put(siteID, siteObjs);
private void setSiteObj(String siteID, String tag, String siteObj) {
synchronized (siteObjMaps) {
Map<String, String> siteObjs = siteObjMaps.get(siteID);
if (siteObjs == null) {
siteObjs = new HashMap<String, String>();
siteObjMaps.put(siteID, siteObjs);
}
siteObjs.put(tag, siteObj);
}
siteObjs.put(tag, siteObj);
}
/*

View file

@ -57,6 +57,9 @@ import com.vividsolutions.jts.geom.Coordinate;
* ------------ ---------- ----------- --------------------------
* Apr 23, 2010 bsteffen Initial creation
* Aug 07, 2013 2077 bsteffen Revise pixel size calculations.
* Aug 27, 2013 2287 randerso Replaced hard coded constant with densityFactor
* parameter to allow application specific density
* scaling to better match A1 displays
*
* </pre>
*
@ -103,6 +106,8 @@ public abstract class AbstractGriddedDisplay<T> implements IRenderable {
protected final int size;
protected final double densityFactor;
protected RGB color;
protected double density = 1.0;
@ -120,16 +125,18 @@ public abstract class AbstractGriddedDisplay<T> implements IRenderable {
* @param descriptor
* @param gridGeometryOfGrid
* @param size
* @param plotLocations
* Pre-configured plot locations. If null, they will be created.
* @param densityFactor
* adjustment factor to make density match A1
*/
public AbstractGriddedDisplay(IMapDescriptor descriptor,
GeneralGridGeometry gridGeometryOfGrid, int size) {
GeneralGridGeometry gridGeometryOfGrid, int size,
double densityFactor) {
this.calculationQueue = new ConcurrentLinkedQueue<Coordinate>();
this.descriptor = descriptor;
this.gridGeometryOfGrid = gridGeometryOfGrid;
this.size = size;
this.densityFactor = densityFactor;
this.gridDims = new int[] {
this.gridGeometryOfGrid.getGridRange().getSpan(0),
@ -211,7 +218,8 @@ public abstract class AbstractGriddedDisplay<T> implements IRenderable {
* infinite loops.
*/
int increment = Math.max(
(int) Math.ceil(adjSize * 0.75 / pixelSize / density), 1);
(int) Math.ceil(adjSize * densityFactor / pixelSize / density),
1);
for (int x = 0; x < gridDims[0]; x += increment) {
for (int y = 0; y < gridDims[1]; y += increment) {

View file

@ -34,6 +34,7 @@ import com.raytheon.uf.viz.core.drawables.PaintProperties;
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.viz.core.contours.util.IVectorGraphicsRenderableFactory;
import com.raytheon.viz.core.contours.util.VectorGraphicsRenderable;
import com.vividsolutions.jts.geom.Coordinate;
@ -53,6 +54,13 @@ import com.vividsolutions.jts.geom.Coordinate;
* Jun 22, 2010 bsteffen Initial creation
* Feb 07, 2011 7948 bkowal added a public method to get
* the direction.
* Aug 27, 2013 2287 randerso Added VectorGraphicsRenderable Factory to allow
* application specific rendering of wind barbs and
* arrows.
* Added densityFactor to allow application specific
* adjustment of density.
* Added gridRelative flag to indicate whether direction
* data is relative to grid or true north
*
* </pre>
*
@ -69,36 +77,43 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
private LineStyle lineStyle;
private double scale = 0.6;
private IExtent lastExtent;
private VectorGraphicsRenderable vectorRenderable;
private boolean gridRelative;
private DisplayType displayType;
private GeodeticCalculator gc;
private IVectorGraphicsRenderableFactory factory;
/**
* @param magnitude
* @param direction
* @param mode
* @param descriptor
* @param gridGeometryOfGrid
* @param imageSize
* @param gridLocation
* @param forceCircle
* @param plotLocations
* Pre-configured plot locations. If null, they will be created.
* @param size
* @param densityFactor
* adjustment factor to make density match A1
* @param gridRelative
* true if direction is grid relative, false if relative to true
* north
* @param displayType
* @param factory
*/
public GriddedVectorDisplay(FloatBuffer magnitude, FloatBuffer direction,
IMapDescriptor descriptor, GeneralGridGeometry gridGeometryOfGrid,
int size, DisplayType displayType) {
super(descriptor, gridGeometryOfGrid, size);
int size, double densityFactor, boolean gridRelative,
DisplayType displayType, IVectorGraphicsRenderableFactory factory) {
super(descriptor, gridGeometryOfGrid, size, densityFactor);
this.magnitude = magnitude;
this.direction = direction;
this.gridRelative = gridRelative;
this.displayType = displayType;
this.gc = new GeodeticCalculator(descriptor.getCRS());
this.factory = factory;
}
@Override
@ -110,8 +125,8 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
lastExtent = paintProps.getView().getExtent().clone();
}
if (vectorRenderable == null) {
vectorRenderable = new VectorGraphicsRenderable(descriptor, target,
this.size, this.scale);
vectorRenderable = factory.createRenderable(descriptor, target,
this.size);
super.paint(target, paintProps);
}
vectorRenderable.setColor(this.color);
@ -126,12 +141,13 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
super.issueRefresh();
}
@Override
protected void paint(Coordinate ijcoord, PaintProperties paintProps,
Coordinate plotLoc, double adjSize) throws VizException {
int idx = (int) (ijcoord.x + (ijcoord.y * this.gridDims[0]));
float spd = this.magnitude.get(idx);
float dir = this.direction.get(idx) - 180;
float dir = this.direction.get(idx);
if (dir < -999999 || dir > 9999999) {
// perhaps this check should limit +/- 180
@ -161,9 +177,13 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
newWorldLocation[1]);
}
dir = dir
+ (float) MapUtil.rotation(latLon,
GridGeometry2D.wrap(gridGeometryOfGrid));
if (gridRelative) {
// rotate data from grid up to true north
dir += (float) MapUtil.rotation(latLon,
GridGeometry2D.wrap(gridGeometryOfGrid));
}
// rotate dir from true north to display up
dir -= this.gc.getAzimuth();
} catch (Exception e) {
throw new VizException(e);
@ -185,14 +205,6 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
}
}
/**
*
* @param color
*/
public void setScale(double scale) {
this.scale = scale;
}
public void setLineWidth(int lineWidth) {
this.lineWidth = lineWidth;
}
@ -208,6 +220,7 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
* @param density
* the density to set
*/
@Override
public boolean setDensity(double density) {
if (super.setDensity(density)) {
disposeResources();
@ -223,6 +236,7 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
* @param magnification
* the magnification to set
*/
@Override
public boolean setMagnification(double magnification) {
if (super.setMagnification(magnification)) {
disposeResources();
@ -245,6 +259,7 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
return direction;
}
@Override
protected void disposeResources() {
if (vectorRenderable != null) {
vectorRenderable.dispose();
@ -252,6 +267,7 @@ public class GriddedVectorDisplay extends AbstractGriddedDisplay<Coordinate> {
}
}
@Override
protected Coordinate createResource(Coordinate coord) throws VizException {
return coord;
}

View file

@ -0,0 +1,46 @@
/**
* 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.core.contours.util;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
/**
* Interface for factory class to create a VectorGraphicsRenderable for
* GriddedVectorDisplay
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 22, 2013 #2287 randerso Initial creation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
public interface IVectorGraphicsRenderableFactory {
public VectorGraphicsRenderable createRenderable(IDescriptor descriptor,
IGraphicsTarget target, double size);
}

View file

@ -38,7 +38,8 @@ import com.vividsolutions.jts.geom.Coordinate;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* May 27, 2011 bsteffen Initial creation
* May 27, 2011 bsteffen Initial creation
* Aug 27, 2013 #2287 randerso Refactored to allow subclassing
*
* </pre>
*
@ -47,17 +48,17 @@ import com.vividsolutions.jts.geom.Coordinate;
*/
public class VectorGraphicsRenderable {
private IWireframeShape lastShape;
protected IWireframeShape lastShape;
private double size = 80;
protected double size = 80;
private double scale = 1.0;
protected double scale = 1.0;
private RGB color;
protected RGB color;
private float lineWidth = 1.0f;
protected float lineWidth = 1.0f;
private LineStyle lineStyle;
protected LineStyle lineStyle;
public VectorGraphicsRenderable(IDescriptor descriptor,
IGraphicsTarget target, double size, double scale) {
@ -89,36 +90,7 @@ public class VectorGraphicsRenderable {
public void paintBarb(Coordinate plotLoc, double adjSize, double spd,
double dir) {
if (spd < 2.5) {
double[][] line = new double[9][2];
double aa = adjSize * .030;
double saa = aa * 0.707;
line[8][0] = line[0][0] = plotLoc.x + aa;
line[8][1] = line[0][1] = plotLoc.y;
line[1][0] = plotLoc.x + saa;
line[1][1] = plotLoc.y + saa;
line[2][0] = plotLoc.x;
line[2][1] = plotLoc.y + aa;
line[3][0] = plotLoc.x - saa;
line[3][1] = plotLoc.y + saa;
line[4][0] = plotLoc.x - aa;
line[4][1] = plotLoc.y;
line[5][0] = plotLoc.x - saa;
line[5][1] = plotLoc.y - saa;
line[6][0] = plotLoc.x;
line[6][1] = plotLoc.y - aa;
line[7][0] = plotLoc.x + saa;
line[7][1] = plotLoc.y - saa;
lastShape.addLineSegment(line);
paintPoint(plotLoc, adjSize);
return;
}
@ -198,6 +170,38 @@ public class VectorGraphicsRenderable {
}
}
protected void paintPoint(Coordinate plotLoc, double adjSize) {
double[][] line = new double[9][2];
double aa = adjSize * .030;
double saa = aa * 0.707;
line[8][0] = line[0][0] = plotLoc.x + aa;
line[8][1] = line[0][1] = plotLoc.y;
line[1][0] = plotLoc.x + saa;
line[1][1] = plotLoc.y + saa;
line[2][0] = plotLoc.x;
line[2][1] = plotLoc.y + aa;
line[3][0] = plotLoc.x - saa;
line[3][1] = plotLoc.y + saa;
line[4][0] = plotLoc.x - aa;
line[4][1] = plotLoc.y;
line[5][0] = plotLoc.x - saa;
line[5][1] = plotLoc.y - saa;
line[6][0] = plotLoc.x;
line[6][1] = plotLoc.y - aa;
line[7][0] = plotLoc.x + saa;
line[7][1] = plotLoc.y - saa;
lastShape.addLineSegment(line);
}
public void paintDualArrow(Coordinate plotLoc, double adjSize, double spd,
double dir) {
if (spd < 4.0) {

View file

@ -0,0 +1,77 @@
/**
* 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.core.contours.util;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
/**
* VectorGraphicsRenderable Factory
*
* Constructs the VectorGraphicsRenderable for D2D usage of GriddedVectorDisplay
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 22, 2013 #2287 randerso Initial creation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
public class VectorGraphicsRenderableFactory implements
IVectorGraphicsRenderableFactory {
private double scale;
public VectorGraphicsRenderableFactory() {
this.scale = 0.6;
}
public VectorGraphicsRenderableFactory(double scale) {
this.scale = scale;
}
/**
* @param scale
* the scale to set
*/
public void setScale(double scale) {
this.scale = scale;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.viz.core.contours.util.IVectorGraphicsRenderableFactory#
* createRenderable()
*/
@Override
public VectorGraphicsRenderable createRenderable(IDescriptor descriptor,
IGraphicsTarget target, double size) {
return new VectorGraphicsRenderable(descriptor, target, size, scale);
}
}

View file

@ -20,10 +20,12 @@
package com.raytheon.viz.gfe.actions;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
@ -42,8 +44,9 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 23, 2008 Eric Babin Initial Creation
* Jul 8, 2008 randerso reworked
* Jul 8, 2008 randerso reworked
* Oct 23, 2012 1287 rferrel Changes for non-blocking AutoSaveIntervalDialog.
* Aug 27, 2013 2302 randerso Code clean up for AutoSaveJob changes
*
* </pre>
*
@ -51,7 +54,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* @version 1.0
*/
public class ShowAutoSaveIntervalDialog extends AbstractHandler {
private AutoSaveIntervalDialog dialog;
final private Map<IWorkbenchWindow, AutoSaveIntervalDialog> dialogMap = new HashMap<IWorkbenchWindow, AutoSaveIntervalDialog>();
/**
*
@ -69,47 +72,28 @@ public class ShowAutoSaveIntervalDialog extends AbstractHandler {
*/
@Override
public Object execute(ExecutionEvent arg0) throws ExecutionException {
final IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
DataManager dm = DataManagerUIFactory.findInstance(window);
if (dm == null) {
return null;
}
AutoSaveIntervalDialog dialog = dialogMap.get(window);
if (dialog == null || dialog.getShell() == null || dialog.isDisposed()) {
final IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
Shell shell = window.getShell();
int interval = AutoSaveJob.getInterval();
boolean autoSaveEnabled = interval > 0;
if (!autoSaveEnabled) {
interval = AutoSaveJob.MAX_INTERVAL;
}
dialog = new AutoSaveIntervalDialog(shell, interval,
autoSaveEnabled);
AutoSaveJob autoSaveJob = dm.getAutoSaveJob();
Shell shell = window.getShell();
dialog = new AutoSaveIntervalDialog(shell, autoSaveJob);
dialogMap.put(window, dialog);
dialog.setBlockOnOpen(false);
dialog.setCloseCallback(new ICloseCallback() {
@Override
public void dialogClosed(Object returnValue) {
if (returnValue instanceof Integer) {
int returnCode = (Integer) returnValue;
if (returnCode == Window.OK) {
DataManager dm = DataManagerUIFactory
.findInstance(window);
// update
if (dialog.isAutoSaveEnabled()) {
int interval = dialog.getCurrentInterval();
AutoSaveJob.setInterval(interval);
if (dm != null) {
dm.enableAutoSave();
}
DataManagerUIFactory.findInstance(window)
.enableAutoSave();
} else {
AutoSaveJob.setInterval(0);
if (dm != null) {
dm.disableAutoSave();
}
}
}
}
dialogMap.remove(window);
}
});
dialog.open();

View file

@ -96,6 +96,7 @@ import com.raytheon.viz.gfe.textformatter.TextProductManager;
* initialized by constructor.
* 04/24/2013 1936 dgilling Move initialization of TextProductMgr
* to GFE startup.
* 08/27/2013 2302 randerso Code cleanup for AutoSaveJob
*
* </pre>
*
@ -271,18 +272,10 @@ public class DataManager {
}
/**
* Start auto save jobs
* @return the autoSaveJob
*/
public void enableAutoSave() {
autoSaveJob.cancel();
autoSaveJob.reSchedule();
}
/**
* Stop auto save jobs
*/
public void disableAutoSave() {
autoSaveJob.cancel();
public AutoSaveJob getAutoSaveJob() {
return autoSaveJob;
}
/**

View file

@ -84,6 +84,7 @@ import com.raytheon.viz.gfe.GFEServerException;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.griddata.AbstractGridData;
import com.raytheon.viz.gfe.core.griddata.IGridData;
import com.raytheon.viz.gfe.core.parm.ParmSaveJob.ParmSaveStatus;
import com.raytheon.viz.gfe.core.parm.ParmState.InterpMode;
import com.raytheon.viz.gfe.core.wxvalue.DiscreteWxValue;
import com.raytheon.viz.gfe.core.wxvalue.ScalarWxValue;
@ -182,6 +183,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* Mar 13, 2013 1792 bsteffen Improve performance of gfe parm average
* ant time weighted average.
* Apr 02, 2013 #1774 randerso Fixed a possible deadlock issue.
* Aug 27, 2013 #2302 randerso Fix simultaneous save issue
*
* </pre>
*
* @author chammack
@ -229,6 +232,8 @@ public abstract class Parm implements Comparable<Parm> {
protected boolean disposed;
private ParmSaveJob saveJob;
/**
* The create from scratch mode
*/
@ -360,6 +365,7 @@ public abstract class Parm implements Comparable<Parm> {
}
this.disposed = false;
this.saveJob = new ParmSaveJob(this);
}
public void dispose() {
@ -708,7 +714,7 @@ public abstract class Parm implements Comparable<Parm> {
* Save a parameter
*
* @param all
* @return
* @return true if save successful
*/
public boolean saveParameter(boolean all) {
if (inParmEdit) {
@ -729,14 +735,16 @@ public abstract class Parm implements Comparable<Parm> {
/**
* Save a parameter
*
* @param tr
* @return
* @param times
* TimeRanges to be saved
* @return true if save successful
*/
public boolean saveParameter(List<TimeRange> tr) {
public boolean saveParameter(List<TimeRange> times) {
if (inParmEdit) {
return false;
} else {
return saveParameterSubClass(tr);
ParmSaveStatus status = this.saveJob.requestSave(times);
return status.isSuccessful();
}
}
@ -744,7 +752,7 @@ public abstract class Parm implements Comparable<Parm> {
* Save a parameter
*
* @param tr
* @return
* @return true if save successful
*/
public boolean saveParameter(TimeRange tr) {
ArrayList<TimeRange> trs = new ArrayList<TimeRange>();
@ -756,7 +764,8 @@ public abstract class Parm implements Comparable<Parm> {
* Subclass specific save implementation
*
* @param tr
* @return
* TimeRanges to be saved
* @return true if save successful
*/
protected abstract boolean saveParameterSubClass(List<TimeRange> tr);

View file

@ -0,0 +1,135 @@
/**
* 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.gfe.core.parm;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Semaphore;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import com.raytheon.uf.common.time.TimeRange;
/**
* Job to queue up and work of parm save requests
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 27, 2013 #2302 randerso Initial creation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
public class ParmSaveJob extends Job {
public static class ParmSaveStatus {
boolean successful = false;
Semaphore complete = new Semaphore(0);
/**
* @return the successful
*/
public boolean isSuccessful() {
try {
complete.acquire();
return successful;
} catch (InterruptedException e) {
return false;
}
}
/**
* @param successful
* the successful to set
*/
private void setSuccessful(boolean successful) {
this.successful = successful;
complete.release();
}
}
private class ParmSaveRequest {
private List<TimeRange> times;
private ParmSaveStatus status;
public ParmSaveRequest(List<TimeRange> times) {
this.times = times;
this.status = new ParmSaveStatus();
}
}
private Parm parm;
private ConcurrentLinkedQueue<ParmSaveRequest> saveQueue;
/**
* @param parm
*/
public ParmSaveJob(Parm parm) {
super("ParmSaveJob");
this.setSystem(true);
this.parm = parm;
this.saveQueue = new ConcurrentLinkedQueue<ParmSaveJob.ParmSaveRequest>();
}
/**
* Request save.
*
* Caller should call isSuccessful on the returned ParmSaveStatus object to
* await completion and to determine success
*
* @param times
* @return ParmSaveStatus object
*/
public ParmSaveStatus requestSave(List<TimeRange> times) {
ParmSaveRequest request = new ParmSaveRequest(times);
this.saveQueue.add(request);
this.schedule();
return request.status;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.
* IProgressMonitor)
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
ParmSaveRequest req = null;
while ((req = this.saveQueue.poll()) != null) {
boolean successful = parm.saveParameterSubClass(req.times);
req.status.setSuccessful(successful);
}
return Status.OK_STATUS;
}
}

View file

@ -29,20 +29,21 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Shell;
import com.raytheon.viz.gfe.jobs.AutoSaveJob;
import com.raytheon.viz.ui.dialogs.CaveJFACEDialog;
import com.raytheon.viz.ui.widgets.SpinScale;
/**
* The auto save iterval dialog.
* The auto save interval dialog.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 30, 2008 Eric Babin Initial Creation
* Jan 30, 2008 Eric Babin Initial Creation
* Aug 27, 2013 #2302 randerso Code cleanup
*
* </pre>
*
@ -52,98 +53,26 @@ import com.raytheon.viz.ui.dialogs.CaveJFACEDialog;
public class AutoSaveIntervalDialog extends CaveJFACEDialog {
private Composite top = null;
private Label intervalMinutes;
private Scale intervalScale;
private int currentInterval = 1;
private boolean autoSaveEnabled = false;
private AutoSaveJob autoSaveJob;
private Button offButton;
private Button onButton;
public AutoSaveIntervalDialog(Shell parent, int currentInterval,
boolean isEnabled) {
private Label intervalLabel;
private SpinScale intervalScale;
/**
* Constructor
*
* @param parent
* @param currentInterval
* @param isEnabled
*/
public AutoSaveIntervalDialog(Shell parent, AutoSaveJob autoSaveJob) {
super(parent);
this.setShellStyle(SWT.TITLE | SWT.MODELESS | SWT.CLOSE);
this.currentInterval = currentInterval;
this.autoSaveEnabled = isEnabled;
}
@Override
protected Control createDialogArea(Composite parent) {
top = (Composite) super.createDialogArea(parent);
top.setLayout(new GridLayout(2, false));
loadConfigData();
initializeComponents();
return top;
}
private void initializeComponents() {
Group g = new Group(top, SWT.NONE);
g.setLayout(new GridLayout(2, true));
offButton = new Button(g, SWT.RADIO);
offButton.setText("Off");
offButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
autoSaveEnabled = false;
}
});
offButton.setSelection(!autoSaveEnabled);
onButton = new Button(g, SWT.RADIO);
onButton.setText("On");
onButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
autoSaveEnabled = true;
}
});
onButton.setSelection(autoSaveEnabled);
Composite c = new Composite(top, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginBottom = 10;
c.setLayout(layout);
c.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
Label label = new Label(c, SWT.NONE);
label.setText("Save Interval in Minutes");
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
intervalScale = new Scale(c, SWT.HORIZONTAL);
intervalScale.setLayoutData(new GridData(120, SWT.DEFAULT));
intervalScale.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
autoSaveEnabled = true;
currentInterval = intervalScale.getSelection();
String s = Integer.toString(currentInterval);
intervalMinutes.setText(s);
intervalMinutes.setToolTipText(s);
onButton.setSelection(autoSaveEnabled);
offButton.setSelection(!autoSaveEnabled);
}
});
intervalScale.setMinimum(AutoSaveJob.MIN_INTERVAL);
intervalScale.setMaximum(AutoSaveJob.MAX_INTERVAL);
intervalScale.setSelection(this.currentInterval);
intervalMinutes = new Label(c, SWT.NONE);
intervalMinutes.setLayoutData(new GridData(20, SWT.DEFAULT));
intervalMinutes.setText(String.valueOf(intervalScale.getSelection()));
this.autoSaveJob = autoSaveJob;
}
/*
@ -154,23 +83,92 @@ public class AutoSaveIntervalDialog extends CaveJFACEDialog {
* .Shell)
*/
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Auto Save Interval Dialog");
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("Auto Save Interval Dialog");
}
/**
* Method for loading the various config data for the dialog.
@Override
protected Control createDialogArea(Composite parent) {
Composite comp = (Composite) super.createDialogArea(parent);
GridLayout layout = (GridLayout) comp.getLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
Group group = new Group(comp, SWT.NONE);
layout = new GridLayout(2, false);
group.setLayout(layout);
GridData layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
group.setLayoutData(layoutData);
group.setText("Auto Save");
int interval = autoSaveJob.getInterval();
offButton = new Button(group, SWT.RADIO);
layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
offButton.setLayoutData(layoutData);
offButton.setText("Off");
offButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if (offButton.getSelection()) {
intervalLabel.setEnabled(false);
intervalScale.setEnabled(false);
}
}
});
offButton.setSelection(interval == 0);
onButton = new Button(group, SWT.RADIO);
layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
onButton.setLayoutData(layoutData);
onButton.setText("On");
onButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if (onButton.getSelection()) {
intervalLabel.setEnabled(true);
intervalScale.setEnabled(true);
}
}
});
onButton.setSelection(interval > 0);
intervalLabel = new Label(group, SWT.CENTER);
intervalLabel.setText("Save Interval in Minutes");
layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false, 2, 1);
intervalLabel.setLayoutData(layoutData);
intervalScale = new SpinScale(group, SWT.HORIZONTAL);
layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false, 2, 1);
layoutData.minimumWidth = 240;
intervalScale.setLayoutData(layoutData);
intervalScale.setMinimum(AutoSaveJob.MIN_INTERVAL);
intervalScale.setMaximum(AutoSaveJob.MAX_INTERVAL);
if (interval > 0) {
intervalScale.setSelection(interval);
} else {
intervalLabel.setEnabled(false);
intervalScale.setEnabled(false);
intervalScale.setSelection(AutoSaveJob.MAX_INTERVAL);
}
return comp;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
private void loadConfigData() {
@Override
protected void okPressed() {
if (offButton.getSelection()) {
autoSaveJob.setInterval(0);
} else {
autoSaveJob.setInterval(intervalScale.getSelection());
}
super.okPressed();
}
public int getCurrentInterval() {
return currentInterval;
}
public boolean isAutoSaveEnabled() {
return autoSaveEnabled;
}
}

View file

@ -24,11 +24,14 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import com.raytheon.viz.gfe.Activator;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.viz.gfe.GFEPreference;
import com.raytheon.viz.gfe.PreferenceConstants;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.parm.Parm;
import com.raytheon.viz.gfe.ui.HazardUIUtils;
/**
* Job implementing the auto save functionality. Uses user preferences to
@ -38,7 +41,8 @@ import com.raytheon.viz.gfe.core.parm.Parm;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 25, 2008 Eric Babin Initial Creation
* Jun 25, 2008 Eric Babin Initial Creation
* Aug 27, 2013 #2302 randerso Fixed to behave more like A1, code cleanup
*
* </pre>
*
@ -47,38 +51,34 @@ import com.raytheon.viz.gfe.core.parm.Parm;
*/
public class AutoSaveJob extends Job {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(AutoSaveJob.class);
private static final int MILLISECONDS_PER_MINUTE = 60 * 1000;
/**
* Max auto save interval in minutes
*/
public static final int MAX_INTERVAL = 60;
/**
* Min auto save interval in minutes
*/
public static final int MIN_INTERVAL = 1;
/**
* auto save interval in minutes, 0 = disabled
* auto save interval in milliseconds, 0 = disabled
*/
private static int interval;
static {
int i = 0;
if (GFEPreference.storeAvailable()) {
i = GFEPreference
.getIntPreference(PreferenceConstants.GFE_AUTO_SAVE_INTERVAL);
}
interval = i;
}
private long interval;
/**
* Set the auto save interval
*
* @param i
* @param interval
* desired interval in minutes
*/
public static void setInterval(int i) {
interval = i;
GFEPreference.setPreference(PreferenceConstants.GFE_AUTO_SAVE_INTERVAL,
Integer.toString(i));
public void setInterval(int interval) {
this.interval = interval * TimeUtil.MILLIS_PER_MINUTE;
this.cancel();
this.reSchedule(this.interval);
}
/**
@ -86,8 +86,8 @@ public class AutoSaveJob extends Job {
*
* @return interval in minutes
*/
public static int getInterval() {
return interval;
public int getInterval() {
return (int) (interval / TimeUtil.MILLIS_PER_MINUTE);
}
private DataManager dataManager;
@ -104,17 +104,28 @@ public class AutoSaveJob extends Job {
this.dataManager = dataManager;
this.disposed = false;
this.setSystem(true);
int pref = GFEPreference
.getIntPreference(PreferenceConstants.GFE_AUTO_SAVE_INTERVAL);
if (pref > MAX_INTERVAL) {
pref = MAX_INTERVAL;
} else if (pref < 0) {
pref = 0;
}
reSchedule();
this.interval = pref * TimeUtil.MILLIS_PER_MINUTE;
reSchedule(this.interval);
}
/**
* Schedule this job to run after the desired interval
* Schedule this job to run after the desired
*
* @param delay
* interval in milliseconds
*/
public void reSchedule() {
public void reSchedule(long delay) {
if (!disposed) {
if (interval > 0) {
this.schedule(interval * MILLISECONDS_PER_MINUTE);
if (delay > 0) {
this.schedule(delay);
}
} else {
dataManager = null;
@ -138,53 +149,51 @@ public class AutoSaveJob extends Job {
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
IStatus status = Status.OK_STATUS;
try {
Parm[] parms = this.dataManager.getParmManager().getModifiedParms();
if (parms != null && parms.length != 0) {
String autoSaveResult = "GFE Auto Save called. Save of Parms[";
for (int i = 0; i < parms.length; i++) {
String name = parms[i].getParmID().getParmName();
if (name.indexOf("Hazards") == -1) {
autoSaveResult += saveParm(parms[i]);
} else {
if (!tempHazardsExist()) {
saveParm(parms[i]);
autoSaveResult += saveParm(parms[i]);
}
}
}
autoSaveResult += "]";
long delay = this.interval;
if (delay > 0) {
String msg = "GFE Auto Save called. ";
boolean success = false;
try {
Parm modifiedParm = getModifiedParm();
if (modifiedParm != null) {
msg += "Save of Parm "
+ modifiedParm.getParmID().getParmName() + " = ";
Activator.getDefault().getLog().log(
new Status(IStatus.INFO, Activator.PLUGIN_ID,
autoSaveResult));
// save the data
success = modifiedParm.saveParameter(false);
msg += (success ? "success" : "failure");
delay = 1500;
} else {
msg += "Nothing to save.";
}
statusHandler.info(msg);
} catch (Exception e) {
msg += "failure";
statusHandler.error(msg, e);
}
} catch (Exception e) {
status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
"GFE auto save failed.", e);
reSchedule(delay);
}
reSchedule();
return status;
return Status.OK_STATUS;
}
/**
* If tempHazards exist, then autosave kicked off in the middle of merge
* hazard. (which creates a "temp" hazard with "haz" in the name.
* Find the first available modified parm. Skip Hazards if temp hazards
* exist
*
* So we will ignore the "Hazard" WE parm save...
*
* @return if temp haz exists.
* @return the first available modified parm or null if none
*/
private boolean tempHazardsExist() {
Parm[] parms = this.dataManager.getParmManager().getDisplayedParms();
for (int i = 0; i < parms.length; i++) {
if (parms[i].getParmID().getParmName().indexOf("haz") != -1) {
return true;
private Parm getModifiedParm() {
boolean tempHazDisplayed = HazardUIUtils
.tempHazardsExist(this.dataManager);
for (Parm p : this.dataManager.getParmManager().getModifiedParms()) {
if (p.getParmID().getParmName().contains("Hazards")
&& tempHazDisplayed) {
continue;
} else {
return p;
}
}
return false;
return null;
}
/**

View file

@ -161,6 +161,7 @@ import com.vividsolutions.jts.geom.Envelope;
* May 11, 2012 njensen Allow rsc to be recycled
* Nov 08, 2012 1298 rferrel Changes for non-blocking FuzzValueDialog.
* Mar 04, 2013 1637 randerso Fix time matching for ISC grids
* Aug 27, 2013 2287 randerso Fixed scaling and direction of wind arrows
*
* </pre>
*
@ -617,6 +618,7 @@ public class GFEResource extends
}
clearVectorDisplays();
GFEVectorGraphicsRenderableFactory factory;
for (VisualizationType type : visTypes) {
switch (type) {
case WIND_ARROW:
@ -626,24 +628,31 @@ public class GFEResource extends
if (logFactor < 0.0) {
logFactor = 0.0;
}
// TODO: add logFactor to PointWindDisplay,
// GriddedVectorDisplay
factory = new GFEVectorGraphicsRenderableFactory(
logFactor, parm.getGridInfo().getMaxValue());
this.vectorDisplay.add(new GriddedVectorDisplay(
mag, dir, descriptor, MapUtil
.getGridGeometry(gs.getGridInfo()
.getGridLoc()),
getVectorSize("WindArrowDefaultSize"),
visTypeToDisplayType(type)));
1.36, false, visTypeToDisplayType(type),
factory));
break;
case WIND_BARB:
this.vectorDisplay.add(new GriddedVectorDisplay(
mag, dir, descriptor, MapUtil
.getGridGeometry(gs.getGridInfo()
.getGridLoc()),
getVectorSize("WindBarbDefaultSize"),
visTypeToDisplayType(type)));
factory = new GFEVectorGraphicsRenderableFactory(
0.0, parm.getGridInfo().getMaxValue());
this.vectorDisplay
.add(new GriddedVectorDisplay(
mag,
dir,
descriptor,
MapUtil.getGridGeometry(gs
.getGridInfo().getGridLoc()),
getVectorSize("WindBarbDefaultSize"),
1.36, false,
visTypeToDisplayType(type), factory));
break;
case IMAGE:
@ -1000,8 +1009,6 @@ public class GFEResource extends
size = 60;
}
size = (int) (size / 0.8);
int offset = parm.getDisplayAttributes().getFontOffset()
+ Activator.getDefault().getPreferenceStore()
.getInt("Contour_font");

View file

@ -0,0 +1,213 @@
/**
* 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.gfe.rsc;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.viz.core.contours.util.VectorGraphicsRenderable;
import com.vividsolutions.jts.geom.Coordinate;
/**
* GFE version of VectorGraphicsRenderable. Subclassed to better match A1 GFE
* behavior
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 22, 2013 #2287 randerso Initial creation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
public class GFEVectorGraphicsRenderable extends VectorGraphicsRenderable {
double minLog = 0.0;
double maxLog = 0.0;
private double maxLimit;
/**
* @param descriptor
* @param target
* @param size
* @param logFactor
* @param maxLimit
*/
public GFEVectorGraphicsRenderable(IDescriptor descriptor,
IGraphicsTarget target, double size, double logFactor,
double maxLimit) {
super(descriptor, target, size, logFactor);
this.maxLimit = maxLimit;
if (logFactor > 0.0) {
minLog = Math.log(logFactor);
maxLog = Math.log(logFactor + 1.0);
}
}
/**
*
* @param plotLoc
* @param adjSize
* @param spd
* @param dir
* barb direction in radians
*/
@Override
public void paintBarb(Coordinate plotLoc, double adjSize, double spd,
double dir) {
paintPoint(plotLoc, adjSize);
int speed = (int) (spd + 2.5);
double staff = adjSize * .4;
double barb = staff * 0.30;
double add = staff * 0.105;
// DIRECTIONS
double uudd = -spd * Math.sin(dir);
double vvff = -spd * Math.cos(dir);
double dix = -uudd / spd;
double djy = -vvff / spd;
double dix1 = Math.cos(Math.toRadians(75)) * dix
+ Math.sin(Math.toRadians(75)) * djy;
double djy1 = (-1) * Math.sin(Math.toRadians(75)) * dix
+ Math.cos(Math.toRadians(75)) * djy;
// SPEED AND COUNTERS:
int n50 = speed / 50;
int calcSpd = speed - 50 * n50;
int n10 = calcSpd / 10;
calcSpd = calcSpd - 10 * n10;
int n5 = calcSpd / 5;
double sx = ((n50 + n50 + n10 + n5 + 2)) * add;
staff = Math.max(adjSize * .4, sx);
// DRAW STAFF
double ix2 = plotLoc.x;
double jy2 = plotLoc.y;
double ix1 = ix2 + dix * staff;
double jy1 = jy2 - djy * staff;
lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } });
// PLOT LONE HALF-BARB, IF NECESSARY
if (n50 == 0 && n10 == 0) {
ix2 = ix1 - dix * add;
jy2 = jy1 + djy * add;
ix1 = ix2 + dix1 * barb / 2.0;
jy1 = jy2 - djy1 * barb / 2.0;
lastShape.addLineSegment(new double[][] { { ix2, jy2 },
{ ix1, jy1 } });
return;
}
// PLOT FLAGS, IF NECESSARY
for (int i = 0; i < n50; i++) {
ix2 = ix1 + dix1 * barb;
jy2 = jy1 - djy1 * barb;
lastShape.addLineSegment(new double[][] { { ix2, jy2 },
{ ix1, jy1 } });
ix1 = ix1 - dix * add * 2;
jy1 = jy1 + djy * add * 2;
lastShape.addLineSegment(new double[][] { { ix2, jy2 },
{ ix1, jy1 } });
}
if (n50 > 0) {
ix1 = ix1 - dix * add / 2.0;
jy1 = jy1 + djy * add / 2.0;
}
// PLOT BARB, IF NECESSARY
for (int i = 0; i < n10; i++) {
ix2 = ix1 + dix1 * barb;
jy2 = jy1 - djy1 * barb;
lastShape.addLineSegment(new double[][] { { ix2, jy2 },
{ ix1, jy1 } });
ix1 = ix1 - dix * add;
jy1 = jy1 + djy * add;
}
// PLOT HALF-BARB, IF NECESSARY
if (n5 != 0) {
ix2 = ix1 + dix1 * barb / 2.0;
jy2 = jy1 - djy1 * barb / 2.0;
lastShape.addLineSegment(new double[][] { { ix2, jy2 },
{ ix1, jy1 } });
}
}
@Override
public void paintArrow(Coordinate plotLoc, double adjSize, double mag,
double dir) {
paintPoint(plotLoc, adjSize);
double staff = 0.0;
double logFactor = this.scale;
// linear scaling
if (logFactor == 0.00) {
staff = mag * size / maxLimit;
} else {
double pcentRange = mag / maxLimit;
double lg = Math.log(logFactor + pcentRange);
double pcentLog = (lg - minLog) / (maxLog - minLog);
staff = pcentLog * size;
}
double barb = staff / 7.0;
// if (staff < barb) {
// return;
// }
double ratio = adjSize / size;
staff *= ratio;
barb *= ratio;
// DIRECTIONS
double uudd = -mag * Math.sin(dir);
double vvff = -mag * Math.cos(dir);
double dix = uudd / mag;
double djy = vvff / mag;
double dix1 = -dix - djy;
double djy1 = dix - djy;
double dix2 = -dix + djy;
double djy2 = -dix - djy;
// DRAW BODY OF ARROW
double ix2 = plotLoc.x;
double jy2 = plotLoc.y;
double ix1 = ix2 + dix * staff;
double jy1 = jy2 - djy * staff;
lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 } });
// DRAW HEAD OF ARROW.
ix2 = ix1 + dix1 * barb;
jy2 = jy1 - djy1 * barb;
double ix3 = ix1 + dix2 * barb;
double jy3 = jy1 - djy2 * barb;
lastShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix1, jy1 },
{ ix3, jy3 } });
}
}

View file

@ -0,0 +1,80 @@
/**
* 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.gfe.rsc;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.viz.core.contours.util.IVectorGraphicsRenderableFactory;
import com.raytheon.viz.core.contours.util.VectorGraphicsRenderable;
/**
* GFE VectorGraphicsRenderable Factory
*
* Constructs the VectorGraphicsRenderable for GFE usage of GriddedVectorDisplay
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 22, 2013 #2287 randerso Initial creation
*
* </pre>
*
* @author randerso
* @version 1.0
*/
public class GFEVectorGraphicsRenderableFactory implements
IVectorGraphicsRenderableFactory {
private double logFactor;
private double maxLimit;
/**
* Constructor
*
* @param logFactor
* logFactor scaling value from parm_arrowScaling preference
* @param maxLimit
* max allowable value for parm
*/
public GFEVectorGraphicsRenderableFactory(double logFactor, double maxLimit) {
this.logFactor = logFactor;
this.maxLimit = maxLimit;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.viz.core.contours.util.IVectorGraphicsRenderableFactory#
* createRenderable(com.raytheon.uf.viz.core.drawables.IDescriptor,
* com.raytheon.uf.viz.core.IGraphicsTarget, double)
*/
@Override
public VectorGraphicsRenderable createRenderable(IDescriptor descriptor,
IGraphicsTarget target, double size) {
return new GFEVectorGraphicsRenderable(descriptor, target, size,
logFactor, maxLimit);
}
}

View file

@ -62,9 +62,11 @@ import com.raytheon.viz.gfe.actions.SetDiscretePickupAction;
import com.raytheon.viz.gfe.actions.SetDiscreteWxPickupAction;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.ISpatialDisplayManager;
import com.raytheon.viz.gfe.core.msgs.GridDataChangedMsg;
import com.raytheon.viz.gfe.core.msgs.IDisplayModeChangedListener;
import com.raytheon.viz.gfe.core.msgs.IDisplayedParmListChangedListener;
import com.raytheon.viz.gfe.core.msgs.IPickupValueChangedListener;
import com.raytheon.viz.gfe.core.msgs.ISpatialEditorTimeChangedListener;
import com.raytheon.viz.gfe.core.msgs.Message;
import com.raytheon.viz.gfe.core.msgs.Message.IMessageClient;
import com.raytheon.viz.gfe.core.msgs.ShowQuickViewDataMsg;
@ -100,6 +102,7 @@ import com.raytheon.viz.ui.input.InputAdapter;
* Changes for non-blocking SetValueDialog.
* 01/23/2013 #1524 randerso Fix error when clicking on discrete color bar when
* no grid exists
* 08/27/2013 #2287 randerso Fixed fitToDataColorTable for Single Grids
*
* </pre>
*
@ -110,7 +113,7 @@ public class GFEColorbarResource extends
AbstractVizResource<GFEResourceData, IMapDescriptor> implements
IContextMenuProvider, IPickupValueChangedListener,
IDisplayModeChangedListener, IMessageClient,
IDisplayedParmListChangedListener {
IDisplayedParmListChangedListener, ISpatialEditorTimeChangedListener {
public static final double HEIGHT = 25.0;
@ -317,6 +320,8 @@ public class GFEColorbarResource extends
dManager.getParmManager().removeDisplayedParmListChangedListener(this);
dManager.getSpatialDisplayManager().removeDisplayModeChangedListener(
this);
dManager.getSpatialDisplayManager()
.removeSpatialEditorTimeChangedListener(this);
IDisplayPaneContainer container = getResourceContainer();
if (container != null) {
@ -324,6 +329,7 @@ public class GFEColorbarResource extends
}
Message.unregisterInterest(this, ShowQuickViewDataMsg.class);
Message.unregisterInterest(this, GridDataChangedMsg.class);
if (colorbarScaleFont != null) {
colorbarScaleFont.dispose();
@ -358,9 +364,12 @@ public class GFEColorbarResource extends
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
dManager.getSpatialDisplayManager().addDisplayModeChangedListener(this);
dManager.getSpatialDisplayManager()
.addSpatialEditorTimeChangedListener(this);
dManager.getParmManager().addDisplayedParmListChangedListener(this);
Message.registerInterest(this, ShowQuickViewDataMsg.class);
Message.registerInterest(this, GridDataChangedMsg.class);
colorbarScaleFont = GFEFonts.makeGFEIFont(target, "ColorBarScale_font",
1);
@ -680,6 +689,16 @@ public class GFEColorbarResource extends
parm = gridId.getParm();
}
updateColorbar(parm);
} else if (message instanceof GridDataChangedMsg) {
GridDataChangedMsg msg = (GridDataChangedMsg) message;
if (currentParm != null
&& msg.getParmID().equals(currentParm.getParmID())
&& msg.getTimeRange().contains(
currentParm.getDataManager()
.getSpatialDisplayManager()
.getSpatialEditorTime())) {
checkFitToData();
}
}
}
@ -689,6 +708,10 @@ public class GFEColorbarResource extends
* continuous colorbar range.
*/
protected void checkFitToData() {
if (currentParm == null) {
return;
}
String parmName = currentParm.getParmID().getParmName();
String fitToDataPref = parmName + "_fitToDataColorTable";
if (GFEPreference.contains(fitToDataPref)) {
@ -836,4 +859,9 @@ public class GFEColorbarResource extends
updateColorbar(normalParm);
}
}
@Override
public void spatialEditorTimeChanged(Date date) {
checkFitToData();
}
}

View file

@ -50,6 +50,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 23, 2010 bsteffen Initial creation
* Aug 27, 2013 #2287 randerso Added densityFactor to allow application specific
* adjustment of density.
*
* </pre>
*
@ -68,13 +70,17 @@ public class GriddedIconDisplay extends AbstractGriddedDisplay<IImage> {
private PointIconFactory iconFactory;
/**
* @param values
* @param descriptor
* @param gridGeometryOfGrid
* @param imageSize
* @param densityFactor
* adjustment factor to make density match A1
*/
public GriddedIconDisplay(float[] values, IMapDescriptor descriptor,
GeneralGridGeometry gridGeometryOfGrid, int imageSize) {
super(descriptor, gridGeometryOfGrid, imageSize);
GeneralGridGeometry gridGeometryOfGrid, int imageSize,
double densityFactor) {
super(descriptor, gridGeometryOfGrid, imageSize, densityFactor);
this.values = values;
}
@ -126,6 +132,7 @@ public class GriddedIconDisplay extends AbstractGriddedDisplay<IImage> {
return (int) values[idx];
}
@Override
public boolean setColor(RGB color) {
if (super.setColor(color)) {
iconFactory = null;
@ -166,8 +173,8 @@ public class GriddedIconDisplay extends AbstractGriddedDisplay<IImage> {
if (renderable.resource != empty) {
PointImage image = new PointImage(renderable.resource,
renderable.plotLocation);
image.setHeight((double) size * magnification);
image.setWidth((double) size * magnification);
image.setHeight(size * magnification);
image.setWidth(size * magnification);
images.add(image);
}
}

View file

@ -87,6 +87,7 @@ import com.raytheon.viz.core.contours.rsc.displays.AbstractGriddedDisplay;
import com.raytheon.viz.core.contours.rsc.displays.GriddedContourDisplay;
import com.raytheon.viz.core.contours.rsc.displays.GriddedStreamlineDisplay;
import com.raytheon.viz.core.contours.rsc.displays.GriddedVectorDisplay;
import com.raytheon.viz.core.contours.util.VectorGraphicsRenderableFactory;
import com.raytheon.viz.core.drawables.ColorMapParameterFactory;
import com.raytheon.viz.core.rsc.displays.GriddedImageDisplay2;
import com.raytheon.viz.core.style.arrow.ArrowPreferences;
@ -111,6 +112,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* May 08, 2013 1980 bsteffen Set paint status in GridResources for
* KML.
* Jul 15, 2013 2107 bsteffen Fix sampling of grid vector arrows.
* Aug 27, 2013 2287 randerso Added new parameters required by GriddedVectorDisplay
* and GriddedIconDisplay
*
* </pre>
*
@ -154,13 +157,14 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
protected AbstractGridResource(T resourceData, LoadProperties loadProperties) {
super(resourceData, loadProperties);
resourceData.addChangeListener(new IResourceDataChanged() {
@Override
public void resourceChanged(ChangeType type, Object object) {
if (type == ChangeType.DATA_UPDATE) {
if (object instanceof PluginDataObject) {
addDataObject((PluginDataObject) object);
} else if (object instanceof PluginDataObject[]) {
for (PluginDataObject pdo : (PluginDataObject[]) object) {
addDataObject((PluginDataObject) pdo);
addDataObject(pdo);
}
} else if (object instanceof Object[]) {
for (Object obj : (Object[]) object) {
@ -489,9 +493,10 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
case ARROW:
case DUALARROW:
convertData(data);
VectorGraphicsRenderableFactory factory = new VectorGraphicsRenderableFactory();
GriddedVectorDisplay vectorDisplay = new GriddedVectorDisplay(
data.getMagnitude(), data.getDirection(), descriptor,
gridGeometry, 64, displayType);
gridGeometry, 64, 0.75, true, displayType, factory);
vectorDisplay.setColor(getCapability(ColorableCapability.class)
.getColor());
vectorDisplay.setLineStyle(getCapability(OutlineCapability.class)
@ -504,14 +509,15 @@ public abstract class AbstractGridResource<T extends AbstractResourceData>
MagnificationCapability.class).getMagnification());
if (stylePreferences != null
&& stylePreferences instanceof ArrowPreferences) {
vectorDisplay.setScale(((ArrowPreferences) stylePreferences)
factory.setScale(((ArrowPreferences) stylePreferences)
.getScale());
}
renderable = vectorDisplay;
break;
case ICON:
GriddedIconDisplay iconDisplay = new GriddedIconDisplay(data
.getScalarData().array(), descriptor, gridGeometry, 80);
.getScalarData().array(), descriptor, gridGeometry, 80,
0.75);
iconDisplay.setColor(getCapability(ColorableCapability.class)
.getColor());
iconDisplay.setDensity(getCapability(DensityCapability.class)

View file

@ -79,6 +79,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* constructor to avoid duplicate data
* requests.
* Jul 15, 2013 2107 bsteffen Fix sampling of grid vector arrows.
* Aug 27, 2013 2287 randerso Removed 180 degree adjustment required by error
* in Maputil.rotation
*
* </pre>
*
@ -174,7 +176,7 @@ public class D2DGridResource extends GridResource<GridResourceData> implements
crs2ll.transform(dp, dp);
Coordinate ll = new Coordinate(dp.x, dp.y);
float rot = (float) MapUtil.rotation(ll, geom);
dir = (dir + rot + 180) % 360;
dir = (dir + rot) % 360;
data.getScalarData().put(index, dir);
}
}

View file

@ -59,6 +59,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* ------------ ---------- ----------- --------------------------
* Mar 09, 2011 bsteffen Initial creation
* Jul 17, 2013 2185 bsteffen Cache computed grid reprojections.
* Aug 27, 2013 2287 randerso Removed 180 degree adjustment required by error
* in Maputil.rotation
*
* </pre>
*
@ -250,8 +252,8 @@ public class GeneralGridData {
Coordinate ll = new Coordinate(dp.x, dp.y);
double rot = MapUtil.rotation(ll, newGeom);
double rot2 = MapUtil.rotation(ll, gridGeometry);
double cos = Math.cos(Math.toRadians(180 + rot - rot2));
double sin = Math.sin(Math.toRadians(180 + rot - rot2));
double cos = Math.cos(Math.toRadians(rot - rot2));
double sin = Math.sin(Math.toRadians(rot - rot2));
double u = udata[index];
double v = vdata[index];
udata[index] = (float) (cos * u - sin * v);

View file

@ -381,6 +381,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
final QcPrecipOptionsDialog dialog = new QcPrecipOptionsDialog(
getParentShell().getShell());
display.asyncExec(new Runnable() {
@Override
public void run() {
dialog.open();
}
@ -407,6 +408,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
final QcTempOptionsDialog dialog = new QcTempOptionsDialog(
getParentShell().getShell());
display.asyncExec(new Runnable() {
@Override
public void run() {
dialog.open();
}
@ -433,6 +435,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
final QcFreezeOptionsDialog dialog = new QcFreezeOptionsDialog(
getParentShell().getShell());
display.asyncExec(new Runnable() {
@Override
public void run() {
dialog.open();
}
@ -559,7 +562,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
j = area_names.length();
}
aList.add(area_names.substring(i, j));
i += j + 1;
i = j + 1;
}
} else {
aList.add(0, area_names.trim());

View file

@ -55,6 +55,8 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Maps;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 4, 2009 snaples Initial creation
* Aug 12, 2013 16490 snaples Fixed mapping of hrap grid to basins
* in get_basin_data
*
* </pre>
*
@ -75,7 +77,6 @@ public class GetBasinData {
int ib, l, numpts, ip, x, y, ip2, ip3, ip4, i;
int hrap_basin_flag = 1;
double lat, lon;
int m;
int mm;
int num_points;
File basin_f = new File(basin_file);
@ -150,20 +151,14 @@ public class GetBasinData {
ib++;
}
// mean_areal_precip_global[ib] = dc.new Maps();
// mean_areal_precip_global[ib].hb5 = "";
maxib = ib;
System.out.println("Size of map array is : " + maxib + " basins");
s.close();
in.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block. Please revise as
// appropriate.
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
return false;
} catch (IOException e) {
// TODO Auto-generated catch block. Please revise as
// appropriate.
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
return false;
} catch (NumberFormatException e) {
@ -192,7 +187,6 @@ public class GetBasinData {
mean_areal_precip_global[ib].tmaps_done = new int[200];
mean_areal_precip_global[ib].zmaps_done = new int[200];
// for (m = 0; m < 200; m++) {
Arrays.fill(mean_areal_precip_global[ib].gz, -1);
Arrays.fill(mean_areal_precip_global[ib].uz, -1);
Arrays.fill(mean_areal_precip_global[ib].mz, -1);
@ -209,30 +203,31 @@ public class GetBasinData {
Arrays.fill(mean_areal_precip_global[ib].tmaps_done, -1);
Arrays.fill(mean_areal_precip_global[ib].zmaps_done, -1);
// }
}
if (hrap_basin_flag == 1) {
try {
System.out.println("Reading basin data from file.");
System.out.println("Reading hrap basin data from file.");
long basin_start = System.currentTimeMillis();
in = new BufferedReader(new FileReader(hrap_f));
char eb[] = new char[100];
Scanner s = new Scanner(in);
String eb = new String();
for (ib = 0; ib < maxib; ib++) {
in.read(eb, 0, 80);
int p = new String(eb).indexOf('\n');
eb = in.readLine(); //(eb, 0, 80);
int p = eb.length(); //new String(eb).indexOf('\n');
if (p != -1) {
p = 0;
}
String t = new String(eb);
Scanner s = new Scanner(t);
eb = eb.trim();
s = new Scanner(eb);
Pattern pc = Pattern.compile("\\s*[A-Z]+$");
numpts = s.nextInt();
mean_areal_precip_global[ib].hrap_points = numpts;
String bchar = "";
bchar = s.findInLine("*$");
mean_areal_precip_global[ib].bchar = bchar;
bchar = s.findInLine(pc);
mean_areal_precip_global[ib].bchar = bchar.trim();
mean_areal_precip_global[ib].hrap_data = new Hrap_Data[numpts];
for (mm = 0; mm < 4; mm++) {
@ -240,42 +235,34 @@ public class GetBasinData {
}
for (l = 0; l < numpts; l++) {
Hrap_Data d = dc.new Hrap_Data();
mean_areal_precip_global[ib].hrap_data[l] = d;
for (mm = 0; mm < 4; mm++) {
mean_areal_precip_global[ib].hrap_data[l].zone[mm] = -1;
}
p = in.read(eb, 0, 100);
eb = in.readLine(); //(eb, 0, 100);
eb = eb.trim();
p = eb.length();
if (p == 0) {
break;
}
t = new String(eb);
// ier = sscanf (ibuf, "%d %d %d %d %d %d\n", &x, &y,
// &ip, &ip2, &ip3,&ip4);
s = new Scanner(eb);
x = s.nextInt();
y = s.nextInt();
if (s.hasNextInt()) {
ip = s.nextInt();
if (ip < 0 || ip > 4) {
System.out
.println("HRAP error in read_basin_data routine.\n");
return false;
}
ip2 = s.nextInt();
ip3 = s.nextInt();
ip4 = s.nextInt();
mean_areal_precip_global[ib].hrap_data[l].x = x;
mean_areal_precip_global[ib].hrap_data[l].y = y;
mean_areal_precip_global[ib].hrap_data[l].zone[ip - 1] = 1;
mean_areal_precip_global[ib].zones[0] = 1;
if (s.hasNextInt()) {
ip2 = s.nextInt();
if (ip2 < 0 || ip2 > 4) {
System.out
.println("HRAP error in read_basin_data routine.\n");
@ -288,7 +275,7 @@ public class GetBasinData {
}
if (s.hasNextInt()) {
ip3 = s.nextInt();
if (ip3 < 0 || ip3 > 4) {
System.out
.println("HRAP error in read_basin_data routine.\n");
@ -301,7 +288,7 @@ public class GetBasinData {
}
if (s.hasNextInt()) {
ip4 = s.nextInt();
if (ip4 < 0 || ip4 > 4) {
System.out
.println("HRAP error in read_basin_data routine.\n");
@ -315,22 +302,18 @@ public class GetBasinData {
}
}
System.out
.println("Finished reading basin data from file, elapsed time: "
+ (System.currentTimeMillis() - basin_start)
+ " ms");
s.close();
in.close();
}
System.out
.println("Finished reading basin data from file, elapsed time: "
+ (System.currentTimeMillis() - basin_start)
+ " ms");
s.close();
in.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block. Please revise as
// appropriate.
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
e);
return false;
} catch (IOException e) {
// TODO Auto-generated catch block. Please revise as
// appropriate.
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
e);
return false;

View file

@ -47,697 +47,123 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
public class RenderPcp {
private static boolean first = true;
Pcp pcp = DailyQcUtils.pcp;
/*
* QC codes
*/
private static final int MISSING = -1;
private static final int STANDARD = 0;
private static final int FAILED = 1;
private static final int MANUAL = 2;
private static final int QUESTIONABLE = 3;
private static final int PARTIAL = 4;
private static final int ESTIMATED = 5;
private static final int TIMEDISTRIBUTED = 6;
private static final int VERIFIED = 8;
/**
* Converts point precipitation data in struct pdata to hrap grid. The 20
* closest stations are precalculated for each grid point - this speeds
* computations for data sets with many precipitation points. If there are
* no good precipitation points for a grid point, then a recalculation is
* made using all precipitation points. 1/R**2 interpolation is used. If
* requested, the final interpolation is scaled using seasonal isohyets. The
* grid is saved as a disk file and used later for a raster or vector (HRAP)
* plot.
*
* @param m
* @param k
* @param mk
* @param numPstations
* @param precip_stations
* @param hrap_grid
* @param pdata
* @param pcp_in_use
*/
public void render_pcp(int pcpn_day, int pcpn_time, int pcpn_time_step,
int numPstations, ArrayList<Station> precip_stations,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
int isom = DailyQcUtils.isom;
int method = DailyQcUtils.method;
int mpe_dqc_max_precip_neighbors = DailyQcUtils.mpe_dqc_max_precip_neighbors;
int i, j, h, hh, time_pos, htotal;
double distance, dist1, dist2, dist, value;
double temp;
int totals[] = new int[5];
for (i = 0; i < 5; i++) {
totals[i] = 0;
}
/*
* pcpn_time_step is a function parameter. It specifies whether to
* interpolate 6hr or 24hr HRAP grid
*/
/*
* pcpn_time is a function parameter. It specifies which 6hr HRAP grid
* to generate. It takes 0,1,2,or 3 to represent different 6hr period of
* a day.
*/
/*
* time_pos is assigned a value of 0,1,2,or 3 (for 6hr data) or 4 (for
* 24hr data). This value is used in
* pdata[pcpn_day].stn[hh].frain[time_pos].data to control whether to
* retrieve 6hr data or 24hr data.
*/
if (pcpn_time_step == 0) {
time_pos = pcpn_time; // for 6 hour data: 0,1,2,3.
} else {
time_pos = 4; // for 24 hour data
/*
* in case the 24hr grid rendering is required, we check
* 24hr_grid_gen_method_token() to determine how to generate the
* grid. New Post OB9.2
*/
if (getTokenValue24hrGridGenMeth() == 1) {
render24hrPcpUsingFour6hr(pcpn_day, pcpn_time, numPstations,
precip_stations, hrap_grid, pdata, pcp_in_use);
return;
}
}
/* begin to interpolate value for each bin in the HRAP grid */
/*
* to interpolate, two quantities are needed first: value and distance.
* They are calculated by using the neighboring stations.
*/
for (i = 0; i < hrap_grid.maxi; i++) {
for (j = 0; j < hrap_grid.maxj; j++) {
/*
* Check if the grid cell is covered by an HSA. If not, then do
* not estimate precipitation for it.
*/
if (hrap_grid.owner[i][j] == -1) {
pcp.value[i][j] = 0;
continue;
}
value = 0.0;
distance = 0.0;
htotal = 0;
/*
* the following for loop is to calculate two quantities: value
* and distance, which later on, are used to interpret the HRAP
* grid.
*/
/*
* It uses neighbor stations of a HRAP grid bin to calculate
* value and distance.
*/
/* for each neighbor station of the grid bin, do the following */
/* For each of the closest stations. */
for (h = 0; h < mpe_dqc_max_precip_neighbors; h++) {
hh = hrap_grid.gage[i][j].index[h];
// hh is index of stations
if (pdata[pcpn_day].stn[hh].frain[time_pos].data < 0) {
/* No precip data. */
continue;
} // frain refers to level 2 data; rrain refers to level 1
if (method == 2 && precip_stations.get(hh).isoh[isom] <= 0) {
continue;
}
if (pdata[pcpn_day].stn[hh].frain[time_pos].qual != 0
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 8
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 6
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 3
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 4
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 2) {
/* The station has a bad qc flag. Do not use it. */
continue;
}
/*
* Convert the coordinates of the grid and station in
* lat/lon into distance.
*/
dist1 = (i + (hrap_grid.hrap_minx - precip_stations.get(hh).hrap_x));
dist2 = (j + (hrap_grid.hrap_miny - precip_stations.get(hh).hrap_y));
dist = Math.pow(dist1, 2) + Math.pow(dist2, 2);
if (dist < .00001) {
dist = .00001;
}
dist = 1 / dist;
temp = pdata[pcpn_day].stn[hh].frain[time_pos].data * dist;
if (method == 2 && precip_stations.get(hh).isoh[isom] > 0) {
temp = temp * hrap_grid.isoh[isom][i][j]
/ (precip_stations.get(hh).isoh[isom] * 25.4);
}
value = value + temp;
distance = distance + dist;
htotal++;
if (htotal == 10) {
break;
}
}
/*
* end for loop (h = 0; h < mpe_dqc_max_precip_neighbors;h++)
* the above for loop is for each neighbor station.
*/
/*
* the above for loop is to calculate value and distance, which
* later on, are used to interpret the HRAP grid
*/
/*
* the resulting htotal is the valid number of neighbor stations
* that are used to calculate value and distance, which later
* on, are used to interpret the HRAP grid
*/
/*
* if there is not enough valid neighbor station, such as htotal
* <4, the code below handle this situation. Basically, the code
* recalculate the value and distance using all the stations --
* see the for (h = 0; h < max_stations; h++) loop below.
*/
if (htotal < 4) {
value = 0.0;
distance = 0.0;
htotal = 0;
for (h = 0; h < numPstations; h++) {
if (pdata[pcpn_day].stn[h].frain[time_pos].data < 0) {
continue;
}
if (pdata[pcpn_day].stn[h].frain[time_pos].qual != 0
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 8
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 6
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 3
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 4
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 2) {
continue;
}
if (method == 2
&& precip_stations.get(h).isoh[isom] <= 0) {
continue;
}
dist1 = (i + (hrap_grid.hrap_minx - precip_stations
.get(h).hrap_x));
dist2 = (j + (hrap_grid.hrap_miny - precip_stations
.get(h).hrap_y));
dist = Math.pow(dist1, 2) + Math.pow(dist2, 2);
/*
* if distance from grid box to station is >
* mpe_dqc_grid_max_distbins,
*/
/* then do not use station */
if (dist < .00001) {
dist = .00001;
}
else if (Math.sqrt(dist) > DailyQcUtils.mpe_dqc_grid_max_dist) {
continue;
}
dist = 1 / dist;
temp = pdata[pcpn_day].stn[h].frain[time_pos].data
* dist;
if (method == 2
&& precip_stations.get(h).isoh[isom] > 0) {
temp = temp
* hrap_grid.isoh[isom][i][j]
/ (precip_stations.get(h).isoh[isom] * 25.4);
}
value = value + temp;
distance = distance + dist;
htotal++;
}
}/* end the handling of special case : if (htotal < 4), */
/* which means there is no enough neighboring stations */
if (htotal == 0) {
pcp.value[i][j] = 0;
} else {
pcp.value[i][j] = (int) (value / distance * 100.0);
}
// if (htotal != 0) {
// pcp.value[i][j] += (int) (value / distance * 100);
// }
if (pcp.value[i][j] < .01) {
pcp.value[i][j] = 0;
}
}
} // end of the ( k = 0; k<4; k++) loop, which interpolates 4 6hr HRAP
// grid.
/* final adjustment of the pcp->value */
// for (i = 0; i < hrap_grid.maxi; i++) {
// hrap_grid comes from the function parameter
// for (j = 0; j < hrap_grid.maxj; j++) {
//
// if (pcp.value[i][j] < .01) {
// pcp.value[i][j] = 0;
// }
// }
// }
if (pcpn_time_step == 0) {
time_pos = pcpn_day * 4 + 3 - pcpn_time;
} else {
time_pos = 40 + pcpn_day;
}
// notice that time_pos is a variable defined inside the function, and
// its value do not need to be limited as 0,1,2,3,or 4. Here it is
// assigned with bigger numbers.
// time_pos = 40 + pcpn_day;
// pcp_in_use[i] = 1 -- grids rendered via Render button OR Save Level2
// option
// = -1 --grids for this time period not rendered (initialization value)
pcp_in_use[time_pos] = 1;
ReadQPFGrids rqp = new ReadQPFGrids();
rqp.write_file("pcp", time_pos, pcp);
}
/*
* get the token value of token mpe_24hr_grid_gen_method. This token will
* determine how we generate the 24hr grid. We can either use the 24hr gage
* values, which is the old way, or we can use four 6hr gage values and add
* them together.
*/
/* there is some problem with the static */
/**
* @param pcpn_day
* @param pcpn_time
* @param numPstations
* @param precip_stations
* @param hrap_grid
* @param pdata
* @param pcp_in_use
*/
private void render24hrPcpUsingFour6hr(int pcpn_day, int pcpn_time,
int numPstations, ArrayList<Station> precip_stations,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
int i, j, k, h, hh, time_pos, htotal;
double distance, dist1, dist2, dist, value;
double temp;
int isom = DailyQcUtils.isom;
int method = DailyQcUtils.method;
int totals[] = new int[5];
int all_total = 0;
int neighbor_total = 0;
for (i = 0; i < 5; i++) {
totals[i] = 0;
}
/*
* pcpn_time_step is function parameter. It specifies whether to
* interpolate 6hr or 24hr HRAP grid
*/
/*
* pcpn_time is a function parameter. It specifies which 6hr HRAP grid
* to generate. It takes 0,1,2,or 3 to represent different 6hr period of
* a day.
*/
/*
* time_pos is assigned a value of 0,1,2,or 3 (for 6hr data) or 4 (for
* 24hr data). This value is used in
* pdata[pcpn_day].stn[hh].frain[time_pos].data to control whether to
* retrieve 6hr data or 24hr data.
*/
/* initialization of the pcp->value */
for (i = 0; i < hrap_grid.maxi; i++) { /*
* hrap_grid comes from the
* function parameter
*/
for (j = 0; j < hrap_grid.maxj; j++) {
pcp.value[i][j] = 0;
}
}
/*
* begin to interpolate 4 6hr grids. At the end of each iteration, the
* calculated interpolation value is added to pcp->value[i][j].
*/
/*
* time_pos is assigned a value of 0,1,2,or 3 (for four 6hr data). This
* value is used in pdata[pcpn_day].stn[hh].frain[time_pos].data to
* retrieve 6hr data.
*/
for (k = 0; k < 4; k++) {
time_pos = k; /* for 6 hour data: 0, 1,2,3. */
/* begin to interpolate value for each bin in the HRAP grid */
/*
* to interpolate, two quantities are needed first: value and
* distance. They are calculated by using the neighboring stations.
*/
for (i = 0; i < hrap_grid.maxi; i++) { /*
* hrap_grid comes from the
* function parameter
*/
for (j = 0; j < hrap_grid.maxj; j++) {
/*
* Check if the grid cell is covered by an HSA. If not, then
* do not estimate precipitation for it.
*/
if (hrap_grid.owner[i][j] == -1) {
pcp.value[i][j] = 0;
continue;
}
value = 0.0;
distance = 0.0;
htotal = 0;
/*
* the following for loop is to calculate two quantities:
* value and distance, which later on, are used to interpret
* the HRAP grid.
*/
/*
* It uses neighbor stations of a HRAP grid bin to calculate
* value and distance.
*/
/*
* for each neighbor station of the grid bin, do the
* following
*/
int mpe_dqc_max_precip_neighbors = DailyQcUtils.mpe_dqc_max_precip_neighbors;
for (h = 0; h < mpe_dqc_max_precip_neighbors; h++) {
hh = hrap_grid.gage[i][j].index[h];/*
* hh is index of
* stations
*/
if (pdata[pcpn_day].stn[hh].frain[time_pos].data < 0) {
/* No precip data. */
continue;
} /*
* frain refers to level 2 data; rain refers to level
* 1
*/
/*
* generate something for output later on if in debug
* mode
*/
// if (debug_level >= 1) {
// if (pdata[pcpn_day].stn[hh].frain[time_pos].qual
// == MISSING)
// {
// missing_total++;
// }
//
// if (pdata[pcpn_day].stn[hh].frain[time_pos].qual
// == ESTIMATED)
// {
// estimated_total++;
// }
//
// if (pdata[pcpn_day].stn[hh].frain[time_pos].qual
// == FAILED)
// {
// failed_total++;
// }
//
// if (method == 2 && station[hh].isoh[isom] <= 0)
// {
// climo_total++;
// }
// } /* end if (debug_level >= 1) */
if (DailyQcUtils.method == 2
&& precip_stations.get(hh).isoh[isom] <= 0) {
continue;
}
if (pdata[pcpn_day].stn[hh].frain[time_pos].qual != 0
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 8
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 6
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 3
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 4
&& pdata[pcpn_day].stn[hh].frain[time_pos].qual != 2) {
/* The station has a bad qc flag. Do not use it. */
continue;
}
/*
* Convert the coordinates of the grid and station in
* lat/lon into distance.
*/
dist1 = (i + hrap_grid.hrap_minx - precip_stations
.get(hh).hrap_x);
dist2 = (j + hrap_grid.hrap_miny - precip_stations
.get(hh).hrap_y);
dist = Math.pow(dist1, 2) + Math.pow(dist2, 2);
if (dist < .00001) {
dist = .00001;
}
dist = 1 / dist;
temp = pdata[pcpn_day].stn[hh].frain[time_pos].data
* dist;
if (method == 2
&& precip_stations.get(hh).isoh[isom] > 0) {
temp = temp
* hrap_grid.isoh[isom][i][j]
/ (precip_stations.get(hh).isoh[isom] * 25.4);
}
value = value + temp;
distance = distance + dist;
htotal++;
if (htotal == 10) {
break;
}
}
/*
* end for loop (h = 0; h <
* mpe_dqc_max_precip_neighbors;h++)
*/
/* the above for loop is for each neighbor station. */
/*
* the above for loop is to calculate value and distance,
* which later on, are used to interpret the HRAP grid
*/
/*
* the resulting htotal is the valid number of neighbor
* stations that are used to calculate value and distance,
* which later on, are used to interpret the HRAP grid
*/
/*
* if there is not enough valid neighbor station, such as
* htotal <4, the code below handle this situation.
* Basically, the code recalculate the value and distance
* using all the stations -- see the for (h = 0; h <
* max_stations; h++) loop below.
*/
if (htotal < 4) {
value = 0.0;
distance = 0.0;
htotal = 0;
for (h = 0; h < numPstations; h++) {
if (pdata[pcpn_day].stn[h].frain[time_pos].data < 0) {
continue;
}
if (pdata[pcpn_day].stn[h].frain[time_pos].qual != 0
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 8
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 6
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 3
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 4
&& pdata[pcpn_day].stn[h].frain[time_pos].qual != 2) {
continue;
}
if (method == 2
&& precip_stations.get(h).isoh[isom] <= 0) {
continue;
}
dist1 = (i + hrap_grid.hrap_minx - precip_stations
.get(h).hrap_x);
dist2 = (j + hrap_grid.hrap_miny - precip_stations
.get(h).hrap_y);
dist = Math.pow(dist1, 2) + Math.pow(dist2, 2);
if (dist < .00001) {
dist = .00001;
}
dist = 1 / dist;
temp = pdata[pcpn_day].stn[h].frain[time_pos].data
* dist;
if (method == 2
&& precip_stations.get(h).isoh[isom] > 0) {
temp = temp
* hrap_grid.isoh[isom][i][j]
/ (precip_stations.get(h).isoh[isom] * 25.4);
}
value = value + temp;
distance = distance + dist;
htotal++;
}
neighbor_total++;
} /* end the handling of special case : if (htotal < 4), */
/* which means there is no enough neighboring stations */
/*
* add the interpreted value for the bin of the HRAP_grid
*/
/*
* if (htotal == 0) { pcp->value[i][j] += 0; } else {
* pcp->value[i][j] += (int) (value / distance * 100); }
*/
if (htotal != 0) {
pcp.value[i][j] += (int) (value / distance * 100);
}
/*
* if (pcp->value[i][j] < .01) { pcp->value[i][j] = 0; }
*/
all_total++;
} /* end of for loop (j = 0; j < hrap_grid->maxj; j++) */
} /* end of for loop (i = 0; i < hrap_grid->maxi; i++) */
/* At this moment, the interpretation of HRAP grid is done */
}/*
* end of the ( k = 0; k<4; k++) loop, which interpolates 4 6hr HRAP
* grid.
*/
/* final adjustment of the pcp->value */
for (i = 0; i < hrap_grid.maxi; i++) { /*
* hrap_grid comes from the
* function parameter
*/
for (j = 0; j < hrap_grid.maxj; j++) {
if (pcp.value[i][j] < .01) {
pcp.value[i][j] = 0;
}
}
}
/* time_pos = pcpn_day * 4 + 3 - pcpn_time; */
time_pos = 40 + pcpn_day;
/*
* pcp_in_use[i] = 1 -- grids rendered via Render button OR Save Level2
* option = -1 --grids for this time period not rendered (initialization
* value)
*/
pcp_in_use[time_pos] = 1;
/*
* results of grid rendering routines (render_t, render_t6, render_pcp,
* render_z) are written to scratch files using the write_file routine.
* scratch file is stored in the scratch directory.
*/
ReadQPFGrids rqp = new ReadQPFGrids();
rqp.write_file("pcp", time_pos, pcp);
}
int getTokenValue24hrGridGenMeth() {
int token_of_24hr_grid_gen_method = 0;
/* int token_of_24hr_grid_gen_method = 0; */
if (first == true) {
String token_name_of_24hr_grid_gen_method_token = "mpe_dqc_24hr_precip_grid_meth";
/* char strTokenValue[50] = { '\0' }; */
String DQC24hrPrecipMeth;
// char message[GAGEQC_MESSAGE_LEN] = { '\0' };
AppsDefaults appsDefaults = AppsDefaults.getInstance();
DQC24hrPrecipMeth = appsDefaults
.getToken(token_name_of_24hr_grid_gen_method_token);
// sprintf(message, "\nSTATUS: token value of \"%s\" : %s\n",
// token_name_of_24hr_grid_gen_method_token, strTokenValue);
// logMessage(message);
if (DQC24hrPrecipMeth != null && DQC24hrPrecipMeth.length() > 0) {
/* we use the token ACCUM_6HR and USE_24HR */
if (DQC24hrPrecipMeth.equalsIgnoreCase("ACCUM_6HR")) {
token_of_24hr_grid_gen_method = 1;
}
}
first = false;
}
return token_of_24hr_grid_gen_method;
}
}
private static boolean first = true;
Pcp pcp = DailyQcUtils.pcp;
/*
* QC codes
*/
private static final int MISSING = -1;
private static final int STANDARD = 0;
private static final int SCREENED = 0;
private static final int FAILED = 1;
private static final int MANUAL = 2;
private static final int QUESTIONABLE = 3;
private static final int PARTIAL = 4;
private static final int ESTIMATED = 5;
private static final int TIMEDISTRIBUTED = 6;
private static final int VERIFIED = 8;
private static final String MPE_DQC_GRID_RENDERING_METHOD_TOKEN = "mpe_dqc_grid_render_method";
private static final int maxDistSquared = DailyQcUtils.mpe_dqc_grid_max_dist
* DailyQcUtils.mpe_dqc_grid_max_dist;
/**
* Converts point precipitation data in struct pdata to hrap grid. The 20
* closest stations are precalculated for each grid point - this speeds
* computations for data sets with many precipitation points. If there are
* no good precipitation points for a grid point, then a recalculation is
* made using all precipitation points. 1/R**2 interpolation is used. If
* requested, the final interpolation is scaled using seasonal isohyets. The
* grid is saved as a disk file and used later for a raster or vector (HRAP)
* plot.
*
* @param m
* @param k
* @param mk
* @param numPstations
* @param
* @param hrap_grid
* @param pdata
* @param pcp_in_use
*/
// mpe_dqc_grid_render_method
// ---------------------------------------------------------------------------------------
public void render_pcp(int pcpn_day, int pcpn_time, int pcpn_time_step,
int numPstations, ArrayList<Station> precip_stations,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
String header = "RenderPcp.render_pcp(): ";
AppsDefaults appsDefaults = AppsDefaults.getInstance();
String tokenValue = appsDefaults
.getToken(MPE_DQC_GRID_RENDERING_METHOD_TOKEN);
// System.out.println(header + "tokenValue = " + tokenValue);
// tokenValue = "BLOCKING";
// tokenValue = "DISTANCE_SQUARED";
System.out.println(header + "now tokenValue = " + tokenValue);
if (tokenValue != null && tokenValue.equalsIgnoreCase("BLOCKING")) {
RenderPcpBlocking renderer = new RenderPcpBlocking();
renderer.render_pcp(pcpn_day, pcpn_time, pcpn_time_step,
numPstations, precip_stations, hrap_grid, pdata, pcp_in_use);
}
else {
RenderPcpStandard renderer = new RenderPcpStandard();
renderer.render_pcp(pcpn_day, pcpn_time, pcpn_time_step,
numPstations, precip_stations, hrap_grid, pdata, pcp_in_use);
}
determineMaxPrecip(hrap_grid);
}
private int determineMaxPrecip(Hrap_Grid hrap_grid) {
// TODO Auto-generated method stub
String header = "RenderPcp.determineMaxPrecip(): ";
int value = 0;
int maxValue = -1;
for (int col = 0; col < hrap_grid.maxi; col++) {
for (int row = 0; row < hrap_grid.maxj; row++) {
value = pcp.value[row][col];
if (value > maxValue) {
maxValue = value;
}
}
}
System.out.println(header + "maxValue = " + maxValue);
return maxValue;
} // end determineMaxPrecip()
// ---------------------------------------------------------------------------------------
} // end class RenderPcp

View file

@ -0,0 +1,957 @@
/**
* 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.mpe.util;
import java.util.ArrayList;
import com.raytheon.uf.common.ohd.AppsDefaults;
import com.raytheon.viz.mpe.util.DailyQcUtils.Hrap_Grid;
import com.raytheon.viz.mpe.util.DailyQcUtils.Pcp;
import com.raytheon.viz.mpe.util.DailyQcUtils.Pdata;
import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
/**
* DESCRIPTION: Maps precipitation station values to an HRAP grid. Produces the
* DailyQC version of the GageOnly analysis.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 11, 2009 snaples Initial creation
* May 02, 2011 8962 snaples Added render24hrPcpUsingFour6hr() method
*
* </pre>
*
* @author snaples
* @version 1.0
*/
public class RenderPcpBlocking {
private static boolean first = true;
Pcp pcp = DailyQcUtils.pcp;
/*
* QC codes
*/
private static final int MISSING = -1;
private static final int STANDARD = 0;
private static final int SCREENED = 0;
private static final int FAILED = 1;
private static final int MANUAL = 2;
private static final int QUESTIONABLE = 3;
private static final int PARTIAL = 4;
private static final int ESTIMATED = 5;
private static final int TIMEDISTRIBUTED = 6;
private static final int VERIFIED = 8;
// private static final String MPE_DQC_GRID_RENDERING_METHOD_TOKEN =
// "mpe_dqc_grid_render_method";
private static final int maxDistSquared = DailyQcUtils.mpe_dqc_grid_max_dist
* DailyQcUtils.mpe_dqc_grid_max_dist;
// private static final int maxDistSquared = 400;
/**
* Converts point precipitation data in struct pdata to hrap grid. The 20
* closest stations are precalculated for each grid point - this speeds
* computations for data sets with many precipitation points. If there are
* no good precipitation points for a grid point, then a recalculation is
* made using all precipitation points. 1/R**2 interpolation is used. If
* requested, the final interpolation is scaled using seasonal isohyets. The
* grid is saved as a disk file and used later for a raster or vector (HRAP)
* plot.
*
* @param m
* @param k
* @param mk
* @param numPstations
* @param
* @param hrap_grid
* @param pdata
* @param pcp_in_use
*/
// mpe_dqc_grid_render_method
private boolean usingSingleDirectionCloseOutMode = true;
private static final int MIN_PREFERRED_USED_GRID_CELLS = 4;
private static final int MIN_REQUIRED_USED_GRID_CELLS = 1;
private SearchDirection north = new SearchDirection();
private SearchDirection south = new SearchDirection();
private SearchDirection east = new SearchDirection();
private SearchDirection west = new SearchDirection();
private int colMin;
private int colMax;
private int rowMin;
private int rowMax;
private int prevColMin;
private int prevColMax;
private int prevRowMin;
private int prevRowMax;
// weighting variables
private int usedGridCellCount = 0;
private double totalWeightedValue = 0;
private double totalDistanceWeight = 0;
// grid variables
private int binStationCount[][];
private int usableStationCount = 0;
private double valueGrid[][];
private double prismStationGrid[][];
private int isom = -1;
class SearchDirection {
private boolean isOpen;
private int level;
public SearchDirection() {
reset();
}
public void reset() {
setOpen(true);
setLevel(0);
}
public boolean isOpen() {
return isOpen;
}
public void setOpen(boolean isOpen) {
this.isOpen = isOpen;
}
public void close() {
setOpen(false);
}
void expandSearchIfAllowed() {
if (isOpen()) {
incrementLevel();
if (getLevel() > DailyQcUtils.mpe_dqc_grid_max_dist) {
setLevel(DailyQcUtils.mpe_dqc_grid_max_dist);
close();
}
}
}
public void incrementLevel() {
this.level++;
}
private void setLevel(int level) {
this.level = level;
}
public int getLevel() {
return level;
}
} // end inner class SearchDirection
// ---------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------
int getTokenValue24hrGridGenMeth() {
int token_of_24hr_grid_gen_method = 0;
if (first == true) {
String tokenName = "mpe_dqc_24hr_precip_grid_meth";
String dqc24hrPrecipMeth;
// char message[GAGEQC_MESSAGE_LEN] = { '\0' };
AppsDefaults appsDefaults = AppsDefaults.getInstance();
dqc24hrPrecipMeth = appsDefaults.getToken(tokenName);
if (dqc24hrPrecipMeth != null) {
/* allowed token values: (ACCUM_6HR, USE_24HR) */
if (dqc24hrPrecipMeth.equalsIgnoreCase("ACCUM_6HR")) {
token_of_24hr_grid_gen_method = 1;
}
}
first = false;
}
return token_of_24hr_grid_gen_method;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
public void render_pcp(int pcpn_day, int pcpn_time, int pcpn_time_step,
int numPstations, ArrayList<Station> stationList,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
isom = DailyQcUtils.isom;
int time_pos;
if (pcpn_time_step == 0) {
time_pos = pcpn_time; // for 6 hour data: 0,1,2,3.
boolean save_grids = true;
boolean accumulate_grids = false;
render_pcp_internal(pcpn_day, pcpn_time, pcpn_time_step,
numPstations, stationList, hrap_grid, pdata, pcp_in_use,
save_grids, accumulate_grids);
} else {
time_pos = 4; // for 24 hour data
/*
* in case the 24hr grid rendering is required, we check
* 24hr_grid_gen_method_token() to determine how to generate the
* grid. New Post OB9.2
*/
// debug
// first = true;
if (getTokenValue24hrGridGenMeth() == 1) {
render24hrPcpUsingFour6hr(pcpn_day, pcpn_time, numPstations,
stationList, hrap_grid, pdata, pcp_in_use);
return;
} else // calculate 24-hour grids the regular way
{
boolean save_grids = true;
boolean accumulate_grids = false;
render_pcp_internal(pcpn_day, pcpn_time, pcpn_time_step,
numPstations, stationList, hrap_grid, pdata,
pcp_in_use, save_grids, accumulate_grids);
}
}
}
private void render_pcp_internal(int pcpn_day, int pcpn_time,
int pcpn_time_step, int numPstations,
ArrayList<Station> stationList, Hrap_Grid hrap_grid, Pdata[] pdata,
int[] pcp_in_use, boolean save_grids, boolean should_accumulate) {
// String header = "RenderPcpBlocking.render_pcp_internal(): ";
int isom = DailyQcUtils.isom;
double resultingPrecipValue = 0.0;
/*-----------------------------------------------------*/
allocateGrids(hrap_grid);
initializeGrids(hrap_grid, should_accumulate);
placeStationsInGrid(pcpn_day, pcpn_time, pcpn_time_step, numPstations,
stationList, hrap_grid, pdata);
// for every grid location, determine its estimated value
for (int col = 0; col < hrap_grid.maxi; col++) {
for (int row = 0; row < hrap_grid.maxj; row++) {
/*
* Check if the grid cell is covered by an HSA. If not, then do
* not estimate precipitation for it.
*/
if (hrap_grid.owner[col][row] == -1) {
pcp.value[row][col] = 0;
continue;
}
if (binStationCount[col][row] > 0) // if any station is in this
// grid bin
{
resultingPrecipValue = valueGrid[col][row];
// adjust grid bin with actual gage by the prism factor
if (prismStationGrid[col][row] > 0) {
double prismStationValue = prismStationGrid[col][row] * 25.4;
double prismGridValue = hrap_grid.isoh[isom][col][row];
double prismFactor = (double) prismGridValue
/ prismStationValue;
resultingPrecipValue *= prismFactor;
} else {
resultingPrecipValue = 0.0;
}
// pcp.value[row][col] is the value of grid,
// so we don't need to estimate a value for [row][col]
}
else // this grid location requires an estimate to be generated
{
resultingPrecipValue = estimateValue(isom, col, row,
hrap_grid);
}
if (resultingPrecipValue >= 0.0) {
int precipInHundredthsOfMm = (int) Math
.floor((resultingPrecipValue * 100.0));
if (should_accumulate) { // for case where we want to make
// 24 = 4 6hr periods added
// together
pcp.value[col][row] += precipInHundredthsOfMm;
} else {
pcp.value[col][row] = precipInHundredthsOfMm;
}
}
} /* end for (col = 0 ... */
} /* end for (row = 0 ... */
// System.out.println(header + "maxPrecip in hundredths of mm = " +
// maxPrecip);
int time_pos;
/*
* notice that time_pos is a variable defined inside the function, and
* its value do not need to be limited as 0,1,2,3,or 4. Here it is
* assigned with bigger numbers.
*/
if (pcpn_time_step == 0) // one of the 6-hr periods
{
time_pos = pcpn_day * 4 + 3 - pcpn_time;
} else // 24 hr
{
time_pos = 40 + pcpn_day;
}
if (save_grids) {
/*
* pcp_in_use[i] = 1 -- grids rendered via Render button OR Save
* Level2 option = -1 --grids for this time period not rendered
* (initialization value)
*/
pcp_in_use[time_pos] = 1;
/*
* results of grid rendering routines (render_t, render_t6,
* render_pcp, render_z) are written to scratch files using the
* write_file routine. scratch file is stored in the scratch
* directory.
*/
ReadQPFGrids rqp = new ReadQPFGrids();
rqp.write_file("pcp", time_pos, pcp);
}
} // end render_pcp_internal()
private double estimateValue(int isom, int col, int row, Hrap_Grid hrap_grid) {
// String header = "RenderPcpBlocking.estimateValue(): ";
int r;
int c;
double estimatedPrecipValue = 0.0;
if (hrap_grid.isoh[isom][col][row] < 0.01) {
estimatedPrecipValue = 0;
return estimatedPrecipValue; // can't do anything more, quit
}
// look through surrounding grid bins only for
// values to be used in the distance-weighted interpolation
// set to open and level = 0
north.reset();
south.reset();
east.reset();
west.reset();
// initialize
totalWeightedValue = 0.0;
totalDistanceWeight = 0.0;
usedGridCellCount = 0;
rowMax = row;
rowMin = row;
colMax = col;
colMin = col;
prevRowMax = rowMax;
prevRowMin = rowMin;
prevColMax = colMax;
prevColMin = colMin;
while (north.isOpen() || south.isOpen() || east.isOpen()
|| west.isOpen()) {
// expand search levels as appropriate
// changes rowMin, rowMax, colMin, colMax
expandGridSearch(col, row, hrap_grid);
if (rowMin < prevRowMin) // grew the top side
{
r = rowMin;
for (c = colMin; c <= colMax; c++) {
processGriddedStationValues(col, row, c, r, hrap_grid);
}
} else // didn't grow the top side
{
if (colMin < prevColMin) // still need to check top left corner
{
c = colMin;
r = rowMin;
processGriddedStationValues(col, row, c, r, hrap_grid);
}
if (colMax > prevColMax) // still need to check top right corner
{
c = colMax;
r = rowMin;
processGriddedStationValues(col, row, c, r, hrap_grid);
}
}
if (rowMax > prevRowMax) // grew the bottom side
{
r = rowMax;
for (c = colMin; c <= colMax; c++) {
processGriddedStationValues(col, row, c, r, hrap_grid);
}
} else // didn't grow the bottom side
{
if (colMin < prevColMin) // still need to check bottom left
// corner
{
c = colMin;
r = rowMax;
processGriddedStationValues(col, row, c, r, hrap_grid);
}
if (colMax > prevColMax) // still need to check bottom right
// corner
{
c = colMax;
r = rowMax;
processGriddedStationValues(col, row, c, r, hrap_grid);
}
}
if (colMin < prevColMin) // grew left side
{
c = colMin;
for (r = rowMin + 1; r < rowMax; r++) {
processGriddedStationValues(col, row, c, r, hrap_grid);
}
}
if (colMax > prevColMax) // grew right side
{
c = colMax;
for (r = rowMin + 1; r < rowMax; r++) {
processGriddedStationValues(col, row, c, r, hrap_grid);
}
}
if (usedGridCellCount >= MIN_PREFERRED_USED_GRID_CELLS) // have
// enough
// cells to
// look at,
// can quit
// now
{
north.close();
south.close();
east.close();
west.close();
// System.out.println(header +
// "met minimum cell preference, resultingPrecipValue = " +
// resultingPrecipValue);
}
} /* end while (northLevelOpen ... */
// set weighted value to the cell or set value to 0.0 if there is not
// enough data
if (usedGridCellCount >= MIN_REQUIRED_USED_GRID_CELLS) {
estimatedPrecipValue = totalWeightedValue / totalDistanceWeight;
// System.out.println(header +
// "met minimum cell requirement, resultingPrecipValue = " +
// resultingPrecipValue);
} else // set to zero precip
{
estimatedPrecipValue = 0.0;
}
return estimatedPrecipValue;
} // end estimateValue()
// *--------------------------------------------------------------------------
void processGriddedStationValues(int renderingCol, int renderingRow,
int gridCol, int gridRow, Hrap_Grid hrap_grid) {
String header = "RenderPcpBlocking.processGriddedStationValues(): ";
int usedCells = 0;
// sprintf(message,
// "renderingCol = %d, renderingRow = %d, gridCol = %d, gridRow = %d \n",
// renderingCol, renderingRow, gridCol, gridRow);
// logMessage(message);
if ((gridCol < 0) || (gridCol > hrap_grid.maxi) || (gridRow < 0)
|| (gridRow > hrap_grid.maxj)) {
System.out.println(header + "OUT OF RANGE gridCol = " + gridCol
+ " gridRow = " + gridRow);
}
double gageValue = valueGrid[gridCol][gridRow];
if (gageValue >= 0.0) // there is a gage
// located at (gridCol,gridRow)
// with a valid precip value
{
usedCells = adjustWeights(gageValue, gridRow, gridCol,
renderingRow, renderingCol, hrap_grid, isom,
prismStationGrid);
usedGridCellCount += usedCells;
// if data was found, close off a direction, usually 2 directions,
// such as north and west
if (usedCells > 0) {
determineDirectionFoundAndCloseOff(renderingCol, renderingRow,
gridCol, gridRow);
}
}
return;
} // end processGriddedStationValues()
// *--------------------------------------------------------------------------
void expandGridSearch(int col, int row, Hrap_Grid hrap_grid) {
// expand search levels as appropriate
north.expandSearchIfAllowed();
south.expandSearchIfAllowed();
east.expandSearchIfAllowed();
west.expandSearchIfAllowed();
// save previous values of row and col min and max
prevRowMax = rowMax;
prevRowMin = rowMin;
prevColMax = colMax;
prevColMin = colMin;
// determine nested for loop ranges
rowMax = row + north.getLevel();
if (rowMax >= hrap_grid.maxj) {
rowMax = hrap_grid.maxj - 1;
north.close();
}
rowMin = row - south.getLevel(); // row
if (rowMin < 0) {
rowMin = 0;
south.close();
}
colMin = col - west.getLevel();
if (colMin < 0) {
colMin = 0;
west.close();
}
colMax = col + east.getLevel();
if (colMax >= hrap_grid.maxi) {
colMax = hrap_grid.maxi - 1;
east.close();
}
return;
} // end expandGridSearch()
/*--------------------------------------------------------------------------*/
void determineDirectionFoundAndCloseOffSimpleVersion(int renderingCol,
int renderingRow, int stationCol, int stationRow) {
if (stationRow < renderingRow) {
south.close();
} else if (stationRow > renderingRow) {
north.close();
}
if (stationCol < renderingCol) {
west.close();
} else if (stationCol > renderingCol) {
east.close();
}
}
/*--------------------------------------------------------------------------*/
void determineDirectionFoundAndCloseOff(int renderingCol, int renderingRow,
int stationCol, int stationRow) {
final int closeEnoughToBeEqual = 2;
// String header =
// "RenderPcpBlocking.determineDirectionFoundAndCloseOff(): ";
// consider taking a diff and a point is considered in a straightline if
// its difference is < 3 from the grid bin to render
int northSouthDifference = Math.abs(stationRow - renderingRow);
int eastWestDifference = Math.abs(stationCol - renderingCol);
boolean isNorthOrSouth = false;
boolean isEastOrWest = false;
if (northSouthDifference - eastWestDifference <= closeEnoughToBeEqual) {
isNorthOrSouth = true;
isEastOrWest = true;
} else if (northSouthDifference > eastWestDifference) {
isNorthOrSouth = true;
} else {
isEastOrWest = true;
}
if (usingSingleDirectionCloseOutMode) {
// System.out.println(header +
// "Using usingSingleDirectionCloseOutMode difference-based close off.");
if (isNorthOrSouth) {
// this point functions as the north-south representative, since
// it is primarily north or south
if (stationRow < renderingRow) {
south.close();
} else if (stationRow > renderingRow) {
north.close();
}
}
if (isEastOrWest) {
if (stationCol < renderingCol) {
west.close();
} else if (stationCol > renderingCol) {
east.close();
}
}
}
else // in mode in which points represent 2 directions (unless directly
// North-south or east-west)
{
// System.out.println(header +
// "Using traditional difference cutoff.");
if (stationRow < renderingRow) {
south.close();
} else if (stationRow > renderingRow) {
north.close();
}
if (stationCol < renderingCol) {
west.close();
} else if (stationCol > renderingCol) {
east.close();
}
}
return;
} // determineDirectionFoundAndCloseOff()
/*--------------------------------------------------------------------------*/
void allocateGrids(Hrap_Grid hrap_grid) {
int maxI = hrap_grid.maxi;
int maxJ = hrap_grid.maxj;
binStationCount = new int[maxI][maxJ];
valueGrid = new double[maxI][maxJ];
prismStationGrid = new double[maxI][maxJ];
return;
}
/*--------------------------------------------------------------------------*/
void initializeGrids(Hrap_Grid hrap_grid, boolean should_accumulate) {
int i = 0;
int j = 0;
/* initialize grids */
for (i = 0; i < hrap_grid.maxi; i++) {
for (j = 0; j < hrap_grid.maxj; j++) {
binStationCount[i][j] = 0;
valueGrid[i][j] = DailyQcUtils.MOSAIC_DEFAULT; // precip in
// inches
prismStationGrid[i][j] = DailyQcUtils.MOSAIC_DEFAULT; // prism
// station
// value
// mapped
// to
// grid
// (this
// algorithm
// only)
if (!should_accumulate) {
// in special 24hr = sum of 4 6hr periods mode,
// we accumulate in this grid, so we don't reinit every time
pcp.value[i][j] = (int) DailyQcUtils.MOSAIC_DEFAULT; // final
// precip
// in
// hundredths
// of
// mm
}
}
}
}
/*--------------------------------------------------------------------------*/
void placeStationsInGrid(int pcpn_day, int pcpn_time, int pcpn_time_step,
int max_stations, ArrayList<Station> stationList,
Hrap_Grid hrap_grid, Pdata pdata[]) {
int method = DailyQcUtils.method;
String header = "RenderPcpBlocking.placeStationsInGrid(): ";
int time_pos;
if (pcpn_time_step == 0) {
time_pos = pcpn_time; // for 6 hour data: 0,1,2,3.
} else {
time_pos = 4; // for 24 hour data
}
int hx, hy;
int h = 0;
int noPrismCount = 0;
// System.out.println("max_stations = " + max_stations);
int maxPrecip = 0;
for (h = 0; h < max_stations; h++) {
Station station = stationList.get(h);
hx = (int) (station.hrap_x - hrap_grid.hrap_minx);
hy = (int) (station.hrap_y - hrap_grid.hrap_miny);
/* check that station is within the site's area */
if (hx >= hrap_grid.maxi || hy >= hrap_grid.maxj || (hx < 0)
|| (hy < 0)) {
// This station cannot be used, because its coordinates are out
// of range
continue;
}
// debug only
int stationCount = binStationCount[hx][hy];
double precipValue = pdata[pcpn_day].stn[h].frain[time_pos].data;
short qualCode = pdata[pcpn_day].stn[h].frain[time_pos].qual;
// skip if not an acceptable quality code
if (qualCode != SCREENED && qualCode != VERIFIED
&& qualCode != TIMEDISTRIBUTED && qualCode != QUESTIONABLE
&& qualCode != PARTIAL && qualCode != MANUAL) {
continue;
}
if ((method == 2) && (station.isoh[isom] <= 0)) // no prism data for
// the station
{
noPrismCount++;
continue;
}
/* if station value is missing, ignore */
if (precipValue >= 0.0) {
int precipIn_h_mm = (int) Math.floor(precipValue * 100.0);
if (precipIn_h_mm > maxPrecip) {
maxPrecip = precipIn_h_mm;
}
// we have data and no other station has been assigned to this
// bin yet
if (binStationCount[hx][hy] == 0) {
binStationCount[hx][hy] = 1;
valueGrid[hx][hy] = precipValue;
prismStationGrid[hx][hy] = station.isoh[isom];
usableStationCount++;
}
else if (stationCount > 0) // we have at least 1 value for this
// grid location
{
double valueGridTotalValue = (valueGrid[hx][hy] * stationCount)
+ precipValue;
double prismGridTotalValue = (prismStationGrid[hx][hy] * stationCount)
+ station.isoh[isom];
binStationCount[hx][hy]++;
stationCount++;
double newGridAvgValue = valueGridTotalValue / stationCount;
double newPrismAvgValue = prismGridTotalValue
/ stationCount;
valueGrid[hx][hy] = newGridAvgValue;
prismStationGrid[hx][hy] = newPrismAvgValue;
usableStationCount++;
} // end else
} // end if
} // end for (h = 0; h < max_stations; h++)
System.out.println(header + " maxPrecip in hundredths of mm = "
+ maxPrecip);
// System.out.println(header +
// " number of stations missing PRISM data = " + noPrismCount);
// System.out.println(header + " usableStationCount = " +
// usableStationCount);
}
// ---------------------------------------------------------------------------------------
/*
* get the token value of token mpe_24hr_grid_gen_method. This token will
* determine how we generate the 24hr grid. We can either use the 24hr gage
* values, which is the old way, or we can use four 6hr gage values and add
* them together.
*/
/* there is some problem with the static */
private void render24hrPcpUsingFour6hr(int pcpn_day, int pcpn_time,
int numPstations, ArrayList<Station> stationList,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
/* initialization of the pcp.value */
for (int i = 0; i < hrap_grid.maxi; i++) {
for (int j = 0; j < hrap_grid.maxj; j++) {
pcp.value[i][j] = 0;
}
}
boolean save_grids = false;
boolean should_accumulate = true;
for (int k = 0; k < 4; k++) {
int pcpn_time_internal = k;
int pcpn_time_step = 0; // means it is one of the 6-hr periods
render_pcp_internal(pcpn_day, pcpn_time_internal, pcpn_time_step,
numPstations, stationList, hrap_grid, pdata, pcp_in_use,
save_grids, should_accumulate);
}
} // end render24hrPcpUsingFour6hr()
// --------------------------------------------------------------------------
int adjustWeights(double originalValue, int otherRow, int otherColumn,
int renderingRow, int renderingColumn, Hrap_Grid hrap_grid,
int monthIndex, double[][] prismStationGrid) {
String header = "RenderPcpBlocking.adjustWeights(): ";
final double MIN_DISTANCE = 0.00001;
int usedCount = 0;
double distanceWeight = 0.0;
double weightedValue = 0.0;
int rowDiff = otherRow - renderingRow;
int colDiff = otherColumn - renderingColumn;
double distanceSquared = (rowDiff * rowDiff) + (colDiff * colDiff);
// int maxDistSquared = DailyQcUtils.mpe_dqc_grid_max_dist *
// DailyQcUtils.mpe_dqc_grid_max_dist;
if (distanceSquared < MIN_DISTANCE) {
distanceSquared = MIN_DISTANCE;
}
/*
* mpe_dqc_grid_max_dist = max distance of influence of a gage in units
* of grid bins
*/
if (distanceSquared <= maxDistSquared) {
distanceWeight = 1.0 / distanceSquared;
weightedValue = originalValue * distanceWeight;
// adjust by PRISM factor
if (prismStationGrid[renderingColumn][renderingRow] > 0) {
double prismFactor = (double) hrap_grid.isoh[monthIndex][renderingColumn][renderingRow]
/ (prismStationGrid[renderingColumn][renderingRow] * 25.4);
weightedValue *= prismFactor;
System.out.println(header + " prismFactor > 0 " + prismFactor);
}
totalWeightedValue += weightedValue;
totalDistanceWeight += distanceWeight;
usedCount++;
}
return usedCount;
}
// ---------------------------------------------------------------------------------------
}

View file

@ -0,0 +1,603 @@
/**
* 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.mpe.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.raytheon.uf.common.ohd.AppsDefaults;
import com.raytheon.viz.mpe.util.DailyQcUtils.Hrap_Grid;
import com.raytheon.viz.mpe.util.DailyQcUtils.Pcp;
import com.raytheon.viz.mpe.util.DailyQcUtils.Pdata;
import com.raytheon.viz.mpe.util.DailyQcUtils.Station;
/**
* DESCRIPTION: Maps precipitation station values to an HRAP grid. Produces the
* DailyQC version of the GageOnly analysis.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 11, 2009 snaples Initial creation
* May 02, 2011 8962 snaples Added render24hrPcpUsingFour6hr() method
*
* </pre>
*
* @author snaples
* @version 1.0
*/
public class RenderPcpStandard {
private static final int MINIMUM_NEAREST_NEIGHBOR_GAGES = 4;
private static final int SUFFICIENT_NEAREST_NEIGHBOR_GAGES = 10;
private static boolean first = true;
Pcp pcp = DailyQcUtils.pcp;
/*
* QC codes
*/
private static final int MISSING = -1;
private static final int STANDARD = 0;
private static final int SCREENED = 0;
private static final int FAILED = 1;
private static final int MANUAL = 2;
private static final int QUESTIONABLE = 3;
private static final int PARTIAL = 4;
private static final int ESTIMATED = 5;
private static final int TIMEDISTRIBUTED = 6;
private static final int VERIFIED = 8;
private static final String MPE_DQC_GRID_RENDERING_METHOD_TOKEN = "mpe_dqc_grid_render_method";
private static final int maxDistSquared = DailyQcUtils.mpe_dqc_grid_max_dist
* DailyQcUtils.mpe_dqc_grid_max_dist;
private static final double BOGUS_ESTIMATED_GRID_VALUE = -1.0;
// weighting variables
// consider making these members of a local variable of an inner class
private double totalWeightedValue = 0;
private double totalDistanceWeight = 0;
/**
* Converts point precipitation data in struct pdata to hrap grid. The 20
* closest stations are precalculated for each grid point - this speeds
* computations for data sets with many precipitation points. If there are
* no good precipitation points for a grid point, then a recalculation is
* made using all precipitation points. 1/R**2 interpolation is used. If
* requested, the final interpolation is scaled using seasonal isohyets. The
* grid is saved as a disk file and used later for a raster or vector (HRAP)
* plot.
*
* @param m
* @param k
* @param mk
* @param numPstations
* @param
* @param hrap_grid
* @param pdata
* @param pcp_in_use
*/
// ---------------------------------------------------------------------------------------
public void render_pcp(int pcpn_day, int pcpn_time, int pcpn_time_step,
int numPstations, ArrayList<Station> precip_stations,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
// String header = "RenderPcpStandard.render_pcp_original(): ";
int isom = DailyQcUtils.isom;
int method = DailyQcUtils.method;
int mpe_dqc_max_precip_neighbors = DailyQcUtils.mpe_dqc_max_precip_neighbors;
int i, j, h, hh, time_pos;
int usedStationCount = 0;
int totals[] = new int[5];
for (i = 0; i < 5; i++) {
totals[i] = 0;
}
/*
* pcpn_time_step is a function parameter. It specifies whether to
* interpolate 6hr or 24hr HRAP grid
*/
/*
* pcpn_time is a function parameter. It specifies which 6hr HRAP grid
* to generate. It takes 0,1,2,or 3 to represent different 6hr period of
* a day.
*/
/*
* time_pos is assigned a value of 0,1,2,or 3 (for 6hr data) or 4 (for
* 24hr data). This value is used in
* pdata[pcpn_day].stn[hh].frain[time_pos].data to control whether to
* retrieve 6hr data or 24hr data.
*/
if (pcpn_time_step == 0) {
time_pos = pcpn_time; // for 6 hour data: 0,1,2,3.
} else {
time_pos = 4; // for 24 hour data
/*
* in case the 24hr grid rendering is required, we check
* 24hr_grid_gen_method_token() to determine how to generate the
* grid. New Post OB9.2
*/
if (getTokenValue24hrGridGenMeth() == 1) {
render24hrPcpUsingFour6hr(pcpn_day, pcpn_time, numPstations,
precip_stations, hrap_grid, pdata, pcp_in_use);
return;
}
}
/* begin to interpolate value for each bin in the HRAP grid */
/*
* to interpolate, two quantities are needed first: value and distance.
* They are calculated by using the neighboring stations.
*/
for (i = 0; i < hrap_grid.maxi; i++) {
for (j = 0; j < hrap_grid.maxj; j++) {
/*
* Check if the grid cell is covered by an HSA. If not, then do
* not estimate precipitation for it.
*/
if (hrap_grid.owner[i][j] == -1) {
pcp.value[i][j] = 0;
continue;
}
totalDistanceWeight = 0.0;
totalWeightedValue = 0.0;
usedStationCount = 0;
boolean usedStation = false;
/*
* the following for loop is to calculate two quantities: value
* and distance, which later on, are used to interpret the HRAP
* grid.
*/
/*
* It uses neighbor stations of a HRAP grid bin to calculate
* value and distance.
*/
/* for each neighbor station of the grid bin, do the following */
/* For each of the closest stations. */
for (h = 0; h < mpe_dqc_max_precip_neighbors; h++) {
// hh is index of stations
hh = hrap_grid.gage[i][j].index[h];
int gageIndex = hh;
usedStation = processStation(gageIndex, isom, i, j,
pcpn_day, pcpn_time, time_pos, method,
precip_stations, hrap_grid, pdata, pcp_in_use,
false);
if (usedStation) {
usedStationCount++;
}
if (usedStationCount == SUFFICIENT_NEAREST_NEIGHBOR_GAGES) {
break;
}
}
/*
* end for loop (h = 0; h < mpe_dqc_max_precip_neighbors;h++)
* the above for loop is for each neighbor station.
*/
/*
* the above for loop is to calculate value and distance, which
* later on, are used to interpret the HRAP grid
*/
/*
* the resulting htotal is the valid number of neighbor stations
* that are used to calculate value and distance, which later
* on, are used to interpret the HRAP grid
*/
/*
* if there is not enough valid neighbor station, such as
* usedStationCount < MINIMUM_NEAREST_NEIGHBOR_GAGES the code
* below handle this situation. Basically, the code recalculate
* the value and distance using all the stations -- see the for
* (h = 0; h < max_stations; h++) loop below.
*/
if (usedStationCount < MINIMUM_NEAREST_NEIGHBOR_GAGES) {
totalWeightedValue = 0.0;
totalDistanceWeight = 0.0;
usedStationCount = 0;
for (h = 0; h < numPstations; h++) {
int gageIndex = h;
usedStation = processStation(gageIndex, isom, i, j,
pcpn_day, pcpn_time, time_pos, method,
precip_stations, hrap_grid, pdata, pcp_in_use,
true);
if (usedStation) {
usedStationCount++;
}
}
}/*
* end the handling of special case : if (usedStationCount <
* MINIMUM_NEAREST_NEIGHBOR_GAGES),
*/
/* which means there are not enough neighboring stations */
// found no usable gages
if (usedStationCount == 0) {
pcp.value[i][j] = 0;
}
else {
pcp.value[i][j] = (int) (totalWeightedValue
/ totalDistanceWeight * 100.0);
}
if (pcp.value[i][j] < .01) {
pcp.value[i][j] = 0;
}
} // end for (j = 0; j < hrap_grid.maxj; j++) {
} // end for (i = 0; i < hrap_grid.maxi; i++) {
if (pcpn_time_step == 0) {
time_pos = pcpn_day * 4 + 3 - pcpn_time;
} else {
time_pos = 40 + pcpn_day;
}
// notice that time_pos is a variable defined inside the function, and
// its value do not need to be limited as 0,1,2,3,or 4. Here it is
// assigned with bigger numbers.
// time_pos = 40 + pcpn_day;
// pcp_in_use[i] = 1 -- grids rendered via Render button OR Save Level2
// option
// = -1 --grids for this time period not rendered (initialization value)
pcp_in_use[time_pos] = 1;
ReadQPFGrids rqp = new ReadQPFGrids();
rqp.write_file("pcp", time_pos, pcp);
}
private boolean processStation(int gageIndex, int isom, int col, int row,
int pcpn_day, int pcpn_time, int time_pos, int method,
ArrayList<Station> stationList, Hrap_Grid hrap_grid, Pdata[] pdata,
int[] pcp_in_use, boolean checkDistance) {
boolean usedStation = false;
Station station = stationList.get(gageIndex);
float value = pdata[pcpn_day].stn[gageIndex].frain[time_pos].data;
if (value < 0) {
return usedStation;// false
}
int qualityCode = pdata[pcpn_day].stn[gageIndex].frain[time_pos].qual;
if (qualityCode != 0 && qualityCode != 8 && qualityCode != 6
&& qualityCode != 3 && qualityCode != 4 && qualityCode != 2) {
return usedStation; // false
}
if (method == 2 && station.isoh[isom] <= 0) {
return usedStation; // false
}
/*
* determine distance between grid bin and the station in question of
* the grid and station in question
*/
double distanceX = (col + (hrap_grid.hrap_minx - station.hrap_x));
double distanceY = (row + (hrap_grid.hrap_miny - station.hrap_y));
double distanceSquared = (distanceX * distanceX)
+ (distanceY * distanceY);
if (distanceSquared < .00001) {
distanceSquared = .00001;
}
if (checkDistance) {
if (distanceSquared > maxDistSquared) // too far away, don't use the
// station
{
return usedStation; // false, bail out, don't adjust weight with
// this reading
}
}
double distanceWeight = 1 / distanceSquared;
double weightedValue = value * distanceWeight;
float prismValue = station.isoh[isom];
if (method == 2 && prismValue > 0) {
weightedValue = weightedValue * hrap_grid.isoh[isom][col][row]
/ (prismValue * 25.4);
}
totalWeightedValue += weightedValue;
totalDistanceWeight += distanceWeight;
usedStation = true;
return usedStation;
}
// ---------------------------------------------------------------------------------------
/*
* get the token value of token mpe_24hr_grid_gen_method. This token will
* determine how we generate the 24hr grid. We can either use the 24hr gage
* values, which is the old way, or we can use four 6hr gage values and add
* them together.
*/
/* there is some problem with the static */
/**
* @param pcpn_day
* @param pcpn_time
* @param numPstations
* @param precip_stations
* @param hrap_grid
* @param pdata
* @param pcp_in_use
*/
private void render24hrPcpUsingFour6hr(int pcpn_day, int pcpn_time,
int numPstations, ArrayList<Station> precip_stations,
Hrap_Grid hrap_grid, Pdata[] pdata, int[] pcp_in_use) {
int i, j, k, h, hh, time_pos;
boolean usedStation = false;
int isom = DailyQcUtils.isom;
int method = DailyQcUtils.method;
int totals[] = new int[5];
int all_total = 0;
int neighbor_total = 0;
int usedStationCount;
for (i = 0; i < 5; i++) {
totals[i] = 0;
}
/*
* pcpn_time_step is function parameter. It specifies whether to
* interpolate 6hr or 24hr HRAP grid
*/
/*
* pcpn_time is a function parameter. It specifies which 6hr HRAP grid
* to generate. It takes 0,1,2,or 3 to represent different 6hr period of
* a day.
*/
/*
* time_pos is assigned a value of 0,1,2,or 3 (for 6hr data) or 4 (for
* 24hr data). This value is used in
* pdata[pcpn_day].stn[hh].frain[time_pos].data to control whether to
* retrieve 6hr data or 24hr data.
*/
/* initialization of the pcp.value */
for (i = 0; i < hrap_grid.maxi; i++) {
for (j = 0; j < hrap_grid.maxj; j++) {
pcp.value[i][j] = 0;
}
}
/*
* begin to interpolate 4 6hr grids. At the end of each iteration, the
* calculated interpolation value is added to pcp.value[i][j].
*/
/*
* time_pos is assigned a value of 0,1,2,or 3 (for four 6hr data). This
* value is used in pdata[pcpn_day].stn[hh].frain[time_pos].data to
* retrieve 6hr data.
*/
for (k = 0; k < 4; k++) {
time_pos = k; /* for 6 hour data: 0, 1,2,3. */
/* begin to interpolate value for each bin in the HRAP grid */
/*
* to interpolate, two quantities are needed first: value and
* distance. They are calculated by using the neighboring stations.
*/
for (i = 0; i < hrap_grid.maxi; i++) {
for (j = 0; j < hrap_grid.maxj; j++) {
/*
* Check if the grid cell is covered by an HSA. If not, then
* do not estimate precipitation for it.
*/
if (hrap_grid.owner[i][j] == -1) {
pcp.value[i][j] = 0;
continue;
}
totalDistanceWeight = 0.0;
totalWeightedValue = 0.0;
usedStationCount = 0;
/*
* for each neighbor station of the grid bin, do the
* following
*/
int mpe_dqc_max_precip_neighbors = DailyQcUtils.mpe_dqc_max_precip_neighbors;
for (h = 0; h < mpe_dqc_max_precip_neighbors; h++) {
hh = hrap_grid.gage[i][j].index[h];/*
* hh is index of
* stations
*/
int gageIndex = hh;
usedStation = processStation(gageIndex, isom, i, j,
pcpn_day, pcpn_time, time_pos, method,
precip_stations, hrap_grid, pdata, pcp_in_use,
false);
if (usedStation) {
usedStationCount++;
}
if (usedStationCount == SUFFICIENT_NEAREST_NEIGHBOR_GAGES) {
break;
}
}
if (usedStationCount < MINIMUM_NEAREST_NEIGHBOR_GAGES) {
// not enough gages, so extend search to all gages
totalWeightedValue = 0.0;
totalDistanceWeight = 0.0;
usedStationCount = 0;
for (h = 0; h < numPstations; h++) {
int gageIndex = h;
usedStation = processStation(gageIndex, isom, i, j,
pcpn_day, pcpn_time, time_pos, method,
precip_stations, hrap_grid, pdata,
pcp_in_use, false);
if (usedStation) {
usedStationCount++;
}
}
neighbor_total++;
}
if (usedStationCount != 0) {
pcp.value[i][j] += (int) ((totalWeightedValue / totalDistanceWeight) * 100);
}
/*
* if (pcp.value[i][j] < .01) { pcp.value[i][j] = 0; }
*/
all_total++;
} /* end of for loop (j = 0; j < hrap_grid.maxj; j++) */
} /* end of for loop (i = 0; i < hrap_grid.maxi; i++) */
/* At this moment, the interpretation of HRAP grid is done */
}/*
* end of the ( k = 0; k<4; k++) loop, which interpolates 4 6hr HRAP
* grid.
*/
/* final adjustment of the pcp.value */
for (i = 0; i < hrap_grid.maxi; i++) {
for (j = 0; j < hrap_grid.maxj; j++) {
if (pcp.value[i][j] < .01) { // this doesn't really make sense,
// since this is an integer
pcp.value[i][j] = 0;
}
}
}
/* time_pos = pcpn_day * 4 + 3 - pcpn_time; */
time_pos = 40 + pcpn_day;
/*
* pcp_in_use[i] = 1 -- grids rendered via Render button OR Save Level2
* option = -1 --grids for this time period not rendered (initialization
* value)
*/
pcp_in_use[time_pos] = 1;
/*
* results of grid rendering routines (render_t, render_t6, render_pcp,
* render_z) are written to scratch files using the write_file routine.
* scratch file is stored in the scratch directory.
*/
ReadQPFGrids rqp = new ReadQPFGrids();
rqp.write_file("pcp", time_pos, pcp);
} // end render24hrPcpUsingFour6hr()
// ---------------------------------------------------------------------------------------
int getTokenValue24hrGridGenMeth() {
int token_of_24hr_grid_gen_method = 0;
if (first == true) {
String tokenName = "mpe_dqc_24hr_precip_grid_meth";
String dqc24hrPrecipMeth;
// char message[GAGEQC_MESSAGE_LEN] = { '\0' };
AppsDefaults appsDefaults = AppsDefaults.getInstance();
dqc24hrPrecipMeth = appsDefaults.getToken(tokenName);
if (dqc24hrPrecipMeth != null) {
/* allowed token values: (ACCUM_6HR, USE_24HR) */
if (dqc24hrPrecipMeth.equalsIgnoreCase("ACCUM_6HR")) {
token_of_24hr_grid_gen_method = 1;
}
}
first = false;
}
return token_of_24hr_grid_gen_method;
}
// -----------------------------------------------------------------------------------
}

View file

@ -20,8 +20,9 @@
package com.raytheon.viz.texteditor.command;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
@ -46,6 +47,7 @@ import com.raytheon.viz.texteditor.util.TextEditorUtil;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 18, 2013 rferrel Initial creation
* Aug 23, 2013 DR 16514 D. Friedman Fix accum/cancel logic.
*
* </pre>
*
@ -59,82 +61,53 @@ public class ProductQueryJob extends Job {
private final IProductQueryCallback callback;
/**
* flag to indicate request accumulate.
*/
private boolean accumulate;
/**
* List queries to perform.
*/
private final List<Request> requests;
/**
* Set of queries main thread is waiting for.
*/
private final Set<Request> expected;
/**
* Transport to use for the queries.
*/
private final IQueryTransport queryTransport;
/**
* Flag to indicate cancel is being performed.
*/
private final AtomicBoolean canceled;
public ProductQueryJob(IProductQueryCallback callback) {
super("Product Query");
setSystem(true);
this.callback = callback;
accumulate = false;
requests = new ArrayList<Request>();
expected = new HashSet<Request>();
queryTransport = TextEditorUtil.getTextDbsrvTransport();
canceled = new AtomicBoolean(false);
}
/**
* Add request to queue and determine what needs to be done to schedule the
* request.
* Add request to queue. If not an incremental update, cancel
* existing requests.
*
* @param command
* @param isObsUpdated
*/
public synchronized void addRequest(ICommand command, boolean isObsUpdated) {
Request request = new Request(command, isObsUpdated);
if (accumulate) {
requests.add(request);
if (getState() == Job.NONE) {
schedule();
}
} else {
requests.clear();
requests.add(request);
if (getState() == Job.NONE) {
schedule();
} else {
cancel();
}
}
}
public boolean isAccumulate() {
return accumulate;
}
/**
* When set to true requests will accumulate and be processed in the order
* received; otherwise the queue is purged and any current request is
* canceled if a new request is received.
*
* @param accumulate
*/
public void setAccumulate(boolean accumulate) {
if (this.accumulate != accumulate) {
synchronized (this) {
requests.clear();
if (getState() != Job.NONE) {
cancel();
}
this.accumulate = accumulate;
}
public synchronized void addRequest(ICommand command, boolean isObsUpdated,
boolean accumulate) {
Request request = new Request(command, isObsUpdated);
if (! accumulate && ! isObsUpdated) {
// Cancel existing requests.
expected.clear();
requests.clear();
}
requests.add(request);
expected.add(request);
schedule();
}
public boolean isExpectingRequests() {
return ! expected.isEmpty();
}
/*
@ -149,65 +122,44 @@ public class ProductQueryJob extends Job {
return Status.OK_STATUS;
}
Request request = null;
try {
while (true) {
synchronized (this) {
if (requests.size() > 0) {
request = requests.remove(0);
} else {
break;
}
while (true) {
final Request request;
synchronized (this) {
if (requests.size() > 0) {
request = requests.remove(0);
} else {
break;
}
}
List<StdTextProduct> prodList = null;
try {
try {
final ICommand command = request.getCommand();
final boolean isObsUpdated = request.isObsUpdated();
final List<StdTextProduct> prodList = command
.executeCommand(queryTransport);
// User may have canceled during long query.
if (!canceled.get()) {
VizApp.runAsync(new Runnable() {
@Override
public void run() {
callback.requestDone(command, prodList,
isObsUpdated);
}
});
} else {
break;
}
prodList = request.getCommand().
executeCommand(queryTransport);
} catch (CommandFailedException e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
if (!canceled.get()) {
VizApp.runAsync(new Runnable() {
@Override
public void run() {
callback.requestDone(null, null, false);
}
});
}
}
} finally {
final List<StdTextProduct> resultProdList = prodList;
VizApp.runAsync(new Runnable() {
@Override
public void run() {
if (expected.remove(request) && resultProdList != null) {
callback.requestDone(request.getCommand(), resultProdList,
request.isObsUpdated());
} else {
callback.requestDone(null, null, false);
}
}
});
}
} finally {
canceled.set(false);
}
return Status.OK_STATUS;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.Job#canceling()
*/
@Override
protected void canceling() {
canceled.set(true);
}
/*
* Class to hold the query command and isObsUpdated flag needed for the
* query and its callback.

View file

@ -329,6 +329,8 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox;
* set the highlight colors.
* 23Jul2013 2176 jsanchez Added a new confirmation message for emergency warnings.
* 25July2013 15733 GHull Read font and color prefs from TextEditorCfg.
* 23Aug2013 DR 16514 D. Friedman Fix handling of completed product requests. Do not change
* command history or close browser window for "update obs".
*
* </pre>
*
@ -1101,11 +1103,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
*/
private boolean overwriteMode = false;
/**
* flag to indicate it a product request is from the GUI or an updated ob.
*/
private final AtomicInteger updateCount = new AtomicInteger(0);
/**
* The expire notification when editing a warn gen product.
*/
@ -3105,12 +3102,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
accumChkBtn = new Button(topBtnRowComp, SWT.CHECK);
accumChkBtn.setText("Accum");
accumChkBtn.setLayoutData(rd);
accumChkBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
productQueryJob.setAccumulate(accumChkBtn.getSelection());
}
});
// Add the Update Observation check button.
rd = new RowData(BUTTON_WIDTH, BUTTON_HEIGHT);
@ -3994,6 +3985,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
// return textColorsCfg;
// }
private void setDefaultTextColor(TextEditorCfg txtClrCfg) {
textBackground = new Color(shell.getDisplay(),
txtClrCfg.getTextBackgroundColor());
@ -5930,12 +5922,15 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
return;
}
if (browser != null) {
browser.close();
browser = null;
if (! isObsUpdated) {
if (browser != null) {
browser.close();
browser = null;
}
commandHistory.addCommand(command);
}
commandHistory.addCommand(command);
statusBarLabel.setText("Loading "
+ TextEditorUtil.getCommandText(command));
statusBarLabel.update();
@ -5944,7 +5939,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
if (queryTransport == null) {
queryTransport = TextEditorUtil.getTextDbsrvTransport();
}
productQueryJob.addRequest(command, isObsUpdated);
productQueryJob.addRequest(command, isObsUpdated,
accumChkBtn.getSelection());
}
/**
@ -6025,7 +6021,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
stripWMOHeaders(prod);
}
if (updateCount.get() > 0) {
if (isObsUpdated) {
updateDisplayedProduct(prod);
} else {
setDisplayedProduct(prod);
@ -6120,13 +6116,15 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
private void postExecute(boolean hasAttachment, boolean enterEditor,
boolean validExecuteCommand, String attachedFilename) {
if (!this.isDisposed()) {
if (hasAttachment) {
statusBarLabel.setText("Attachment: " + attachedFilename);
} else {
statusBarLabel.setText("");
if (! productQueryJob.isExpectingRequests()) {
if (hasAttachment) {
statusBarLabel.setText("Attachment: " + attachedFilename);
} else {
statusBarLabel.setText("");
}
statusBarLabel.update();
setBusy(false);
}
statusBarLabel.update();
setBusy(false);
// Automatically open the editor window with returned data.
if (enterEditor) {
enterEditor();
@ -6505,7 +6503,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
@Override
public void setAccumulation(boolean flag) {
this.accumChkBtn.setSelection(flag);
productQueryJob.setAccumulate(flag);
}
/*
@ -6992,7 +6989,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
// retrieved for display in this text editor dialog
// instance.
TextDisplayModel.getInstance().setStdTextProduct(token, product);
updateCount.addAndGet(-1);
}
/*
@ -7343,7 +7339,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
msgPIL = "";
}
if (isObsDisplayed(msgPIL)) {
updateCount.addAndGet(1);
ICommand command = CommandFactory.getAfosCommand(msgPIL);
UpdateObsRun run = new UpdateObsRun(command);
VizApp.runSync(run);

View file

@ -32,6 +32,7 @@ import java.util.List;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Dec 11, 2007 #601 chammack Initial Creation.
* Aug 19, 2013 2177 jsanchez Removed suppress attribute.
*
* </pre>
*
@ -49,11 +50,6 @@ public class AffectedAreas {
*/
protected List<String> partOfArea;
/**
* The partOfArea to suppress (e.g. "ns")
*/
protected String suppress;
/** The notation of the area affected (e.g. "COUNTY") */
protected String areaNotation;
@ -89,17 +85,15 @@ public class AffectedAreas {
public String getName() {
return name;
}
/**
* @param name
* the name to set
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the areaNotation
*/

View file

@ -46,7 +46,6 @@ import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.viz.warngen.gui.WarngenLayer;
import com.raytheon.viz.warngen.suppress.SuppressMap;
import com.raytheon.viz.warngen.util.Abbreviation;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.prep.PreparedGeometry;
@ -74,6 +73,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
* Nov 9, 2012 DR 15430 D. Friedman Extracted method converFeAreaToPartList.
* Apr 29, 2013 1955 jsanchez Ignored comparing the geometry's user data when finding intersected areas.
* May 2, 2013 1963 jsanchez Updated method to determine partOfArea.
* Aug 19, 2013 2177 jsanchez Used portionsUtil to calculate area portion descriptions.
* </pre>
*
* @author chammack
@ -89,13 +89,15 @@ public class Area {
*/
public static final double DEFAULT_PORTION_TOLERANCE = 0.60;
private Area() {
private PortionsUtil portionsUtil;
public Area(PortionsUtil portionsUtil) {
this.portionsUtil = portionsUtil;
}
public static AffectedAreas[] findAffectedAreas(
WarngenConfiguration config, Geometry polygon,
Geometry warningArea, String localizedSite) throws VizException {
public AffectedAreas[] findAffectedAreas(WarngenConfiguration config,
Geometry polygon, Geometry warningArea, String localizedSite)
throws VizException {
// --- Begin argument checking ---
Validate.notNull(config.getGeospatialConfig().getAreaSource(),
@ -113,7 +115,7 @@ public class Area {
localizedSite, geoms);
}
private static AffectedAreas[] findAffectedAreas(
private AffectedAreas[] findAffectedAreas(
AreaSourceConfiguration areaConfig,
GeospatialConfiguration geospatialConfig, Geometry polygon,
String localizedSite, List<Geometry> geoms) throws VizException {
@ -183,7 +185,6 @@ public class Area {
area.stateabbr = regionFeature.attributes.get(areaNotationField)
.toString();
area.size = regionGeom.getArea();
area.suppress = suppressType(areaSource, area.stateabbr, area.fips);
Object tzData = regionFeature.attributes.get(timezonePathcastField);
@ -219,9 +220,16 @@ public class Area {
double tolerCheck = regionGeom.getArea()
* DEFAULT_PORTION_TOLERANCE;
if (areaIntersection < tolerCheck) {
area.partOfArea = GisUtil
.asStringList(GisUtil.calculatePortion(regionGeom,
intersection, true, true));
try {
String entityID = area.stateabbr + areaSource.charAt(0)
+ area.fips.substring(2);
area.partOfArea = GisUtil.asStringList(portionsUtil
.getPortions(entityID, regionGeom, intersection,
true));
} catch (Exception e) {
statusHandler.error("Unable to calculate part of area for "
+ area.name, e);
}
}
// Search the parent region
@ -277,10 +285,9 @@ public class Area {
* @return
* @throws VizException
*/
public static Map<String, Object> findInsectingAreas(
WarngenConfiguration config, Geometry warnPolygon,
Geometry warnArea, String localizedSite, WarngenLayer warngenLayer)
throws VizException {
public Map<String, Object> findInsectingAreas(WarngenConfiguration config,
Geometry warnPolygon, Geometry warnArea, String localizedSite,
WarngenLayer warngenLayer) throws VizException {
Map<String, Object> areasMap = new HashMap<String, Object>();
String hatchedAreaSource = config.getHatchedAreaSource()
@ -311,18 +318,6 @@ public class Area {
}
private static String suppressType(String areaSource, String state,
String fips) {
String retVal = SuppressMap.NONE;
String type = areaSource.equalsIgnoreCase("zone") ? "Z" : "C";
if (state != null && fips != null) {
String key = state + type + fips.substring(2);
retVal = SuppressMap.getInstance().getType(key);
}
return retVal;
}
public static List<String> converFeAreaToPartList(String feArea) {
final List<String> partList = new ArrayList<String>();
if (feArea == null) {

View file

@ -0,0 +1,178 @@
/**
* 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.warngen.gis;
/**
* Port of A1 constants applied to a grid to determine county or zone portions.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 5, 2013 2177 jsanchez Initial creation
*
* </pre>
*
* @author jsanchez
* @version 1.0
*/
public class CoverageConstants {
public static final int XSOUTH = 0x0001;
public static final int SOUTH = 0x0002;
public static final int NORTH = 0x0040;
public static final int XNORTH = 0x0080;
public static final int CENTER_NS = 0x0018;
public static final int CENTRAL_NS = 0x0024;
public static final int XWEST = 0x0100;
public static final int WEST = 0x0200;
public static final int EAST = 0x4000;
public static final int XEAST = 0x8000;
public static final int CENTER_EW = 0x1800;
public static final int CENTRAL_EW = 0x2400;
public static final int SOUTHERN = 0x0003;
public static final int NORTHERN = 0x00C0;
public static final int WESTERN = 0x0300;
public static final int EASTERN = 0xC000;
public static final int SOUTHSIDE = 0x000F;
public static final int NORTHSIDE = 0x00F0;
public static final int WESTSIDE = 0x0F00;
public static final int EASTSIDE = 0xF000;
public static final int EXTREME = 0x8181;
public static final int NOT_EXTREME = 0x7E7E;
public static final int EXTREME_NS = 0x0081;
public static final int EXTREME_EW = 0x8100;
public static final int CENTRAL = 0x2424;
public static final int CENTER = 0x1818;
public static final int NOT_CENTRAL = 0xC3C3;
public static final int NORTH_SOUTH = 0x00FF;
public static final int EAST_WEST = 0xFF00;
public static final int NNE = 0x0001;
public static final int ENE = 0x0002;
public static final int ESE = 0x0004;
public static final int SSE = 0x0008;
public static final int SSW = 0x0010;
public static final int WSW = 0x0020;
public static final int WNW = 0x0040;
public static final int NNW = 0x0080;
public static final int EXTREME_YES = 0xFFFF00;
public static final int EXTREME_NO = 0x00FF;
public static final int EXTREME_CORNER = 0xFF0000;
public static int[] NS_MASK = new int[256];
public static int[] EW_MASK = new int[256];
static {
int i;
NS_MASK[0] = 0;
for (i = 1; i < 256; i++) {
if (i < 87) {
NS_MASK[i] = XSOUTH | SOUTH;
} else if (i > 167) {
NS_MASK[i] = XNORTH | NORTH;
} else if (i < 106) {
NS_MASK[i] = SOUTH;
} else if (i > 148) {
NS_MASK[i] = NORTH;
} else if (i < 118) {
NS_MASK[i] = CENTRAL_NS | SOUTH;
} else if (i > 138) {
NS_MASK[i] = CENTRAL_NS | NORTH;
} else if (i < 127) {
NS_MASK[i] = CENTER_NS | CENTRAL_NS | SOUTH;
} else if (i > 127) {
NS_MASK[i] = CENTER_NS | CENTRAL_NS | NORTH;
} else {
NS_MASK[i] = CENTER_NS | CENTRAL_NS;
}
}
EW_MASK[0] = 0;
for (i = 1; i < 256; i++) {
if (i < 87) {
EW_MASK[i] = XWEST | WEST;
} else if (i > 167) {
EW_MASK[i] = XEAST | EAST;
} else if (i < 106) {
EW_MASK[i] = WEST;
} else if (i > 145) {
EW_MASK[i] = EAST;
} else if (i < 118) {
EW_MASK[i] = CENTRAL_EW | WEST;
} else if (i > 138) {
EW_MASK[i] = CENTRAL_EW | EAST;
} else if (i < 127) {
EW_MASK[i] = CENTER_EW | CENTRAL_EW | WEST;
} else if (i > 127) {
EW_MASK[i] = CENTER_EW | CENTRAL_EW | EAST;
} else {
EW_MASK[i] = CENTER_EW | CENTRAL_EW;
}
}
}
private CoverageConstants() {
}
}

View file

@ -0,0 +1,65 @@
/**
* 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.warngen.gis;
/**
* Simple port of an A1 struct created by GridUtil and used by PortionsUtil.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 5, 2013 2177 jsanchez Initial creation
*
* </pre>
*
* @author jsanchez
* @version 1.0
*/
public class EntityData {
private int meanMask = 0;
private int coverageMask = 0;
private int octants = 0;
public EntityData(int meanMask, int coverageMask, int octants) {
this.meanMask = meanMask;
this.coverageMask = coverageMask;
this.octants = octants;
}
public int getMeanMask() {
return meanMask;
}
public int getCoverageMask() {
return coverageMask;
}
public int getOctants() {
return octants;
}
}

View file

@ -0,0 +1,616 @@
/**
* 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.warngen.gis;
import java.util.ArrayList;
import java.util.List;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.metadata.spatial.PixelOrientation;
import org.opengis.referencing.operation.MathTransform;
import com.raytheon.uf.common.dataplugin.warning.util.GeometryUtil;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.viz.warngen.gui.WarngenLayer;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.prep.PreparedGeometry;
import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
/**
* Converts the county or zone and the intersecting warning area to grids. The
* county or zone is also weighted to determine the northern, southern, eastern,
* and western parts of the county or zone. Most of the code is ported from A1
* to create an EntityData object that will be used by PortionsUtil to determine
* the applicable impacted portions of a county or zone.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 5, 2013 jsanchez Initial creation
*
* </pre>
*
* @author jsanchez
* @version 1.0
*/
public class GridUtil {
private int ny = 0;
private int nx = 0;
private int[] ewGrid;
private int[] nsGrid;
private byte[] warnedAreaGrid;
private byte[] countyOrZoneGrid;
private WarngenLayer layer;
private MathTransform latLonToContour, contourToLatLon;
public GridUtil(WarngenLayer layer, GeneralGridGeometry localGridGeometry,
MathTransform localToLatLon) throws Exception {
this.layer = layer;
GridEnvelope range = localGridGeometry.getGridRange();
this.nx = range.getHigh(0);
this.ny = range.getHigh(1);
org.opengis.geometry.Envelope ge = localGridGeometry.getEnvelope();
contourToLatLon = new DefaultMathTransformFactory()
.createConcatenatedTransform(new GridGeometry2D(range, ge)
.getGridToCRS(PixelOrientation.CENTER), localToLatLon);
latLonToContour = contourToLatLon.inverse();
ewGrid = new int[nx * ny];
nsGrid = new int[nx * ny];
}
/**
* Converts the countyOrZone geometry and the warnedArea into grids and sets
* the appropriate data in an EntityData object.
*
* @param countyOrZone
* @param warnedArea
* @return
* @throws Exception
*/
public EntityData calculateGrids(Geometry countyOrZone, Geometry warnedArea)
throws Exception {
countyOrZoneGrid = toByteArray(countyOrZone);
warnedAreaGrid = toByteArray(warnedArea);
int[] bounds = awips1FinishAreaEntity();
EntityData entityData = finishDefineArea(bounds);
return entityData;
}
/**
* Converts the geometry into a byte array that is expected by ported A1
* code.
*
* @param geometry
* @return
* @throws VizException
*/
private byte[] toByteArray(Geometry geometry) throws VizException {
byte[] bytes = new byte[nx * ny];
float[][] floatData = toFloatData(geometry);
// Rotates grid
int k = 0;
for (int j = ny - 1; j >= 0; j--) {
for (int i = 0; i < nx; i++) {
if (floatData[i][j] == 1) {
bytes[k] = 1;
}
k++;
}
}
return bytes;
}
/**
* Converts the geometry into a 2-D float array.
*
* @param geometry
* @return
* @throws VizException
*/
private float[][] toFloatData(Geometry geometry) throws VizException {
Geometry contoured = layer.convertGeom(geometry, latLonToContour);
List<Geometry> geomList = new ArrayList<Geometry>(
contoured.getNumGeometries());
GeometryUtil.buildGeometryList(geomList, contoured);
List<PreparedGeometry> prepped = new ArrayList<PreparedGeometry>(
geomList.size());
for (Geometry g : geomList) {
prepped.add(PreparedGeometryFactory.prepare(g));
}
GeometryFactory gf = geometry.getFactory();
Point point = gf.createPoint(new Coordinate(0, 0));
CoordinateSequence pointCS = point.getCoordinateSequence();
float[][] contourAreaData = new float[nx][ny];
for (PreparedGeometry geom : prepped) {
Envelope env = geom.getGeometry().getEnvelopeInternal();
int startX = (int) env.getMinX();
int startY = (int) env.getMinY();
int width = (int) env.getMaxX();
int height = (int) env.getMaxY();
if (startX < 0 || width > nx || startY < 0 || height > ny) {
continue;
}
startX = Math.max(0, startX - 1);
startY = Math.max(0, startY - 1);
width = Math.min(nx, width + 1);
height = Math.min(ny, height + 1);
for (int x = startX; x < width; ++x) {
for (int y = startY; y < height; ++y) {
pointCS.setOrdinate(0, 0, x);
pointCS.setOrdinate(0, 1, y);
point.geometryChanged();
if (contourAreaData[x][y] == 0.0f && geom.intersects(point)) {
contourAreaData[x][y] = 1.0f;
}
}
}
}
return contourAreaData;
}
/**
* Ported only the logic from A1 code
* GeoEntityLookupTable::finishDefineArea() that calculates the meanMask,
* coverageMask,and octants for an entity (i.e. county or zone).
*
* @param countyOrZone
* @param warnedArea
* @return
*/
private EntityData finishDefineArea(int[] bounds) {
int meanMask = 0;
int coverageMask = 0;
int octants = 0;
int ewCount = 0;
int nsCount = 0;
int ewTotal = 0;
int nsTotal = 0;
int k = 0;
int min_i = bounds[0];
int max_i = bounds[1];
int min_j = bounds[2];
int max_j = bounds[3];
for (int j = min_j; j < max_j; j++) {
k = nx * j + min_i;
for (int i = min_i; i < max_i; i++, k++) {
if (warnedAreaGrid[k] == 1) {
int e = countyOrZoneGrid[k];
int ii = ewGrid[k];
int jj = nsGrid[k];
if (ii == 0 && jj == 0) {
continue;
}
ewTotal += ii;
if (ii > 0) {
ewCount++;
}
nsTotal += jj;
if (jj > 0) {
nsCount++;
}
int m = CoverageConstants.EW_MASK[ii]
| CoverageConstants.NS_MASK[jj];
coverageMask |= m;
if ((m & CoverageConstants.CENTRAL) == CoverageConstants.CENTRAL) {
continue;
}
if (ii == 0) {
ii = 127;
}
if (jj == 0) {
jj = 127;
}
if (ii < 127) {
if (jj < 127) {
e = (ii > jj ? CoverageConstants.SSW
: CoverageConstants.WSW);
} else {
e = (ii > 254 - jj ? CoverageConstants.NNW
: CoverageConstants.WNW);
}
} else {
if (jj < 127) {
e = (ii < 254 - jj ? CoverageConstants.SSE
: CoverageConstants.ESE);
} else {
e = (ii < jj ? CoverageConstants.NNE
: CoverageConstants.ENE);
}
}
if ((m & CoverageConstants.EXTREME_NS) > 0) {
e <<= 8;
}
if ((m & CoverageConstants.EXTREME_EW) > 0) {
e <<= 8;
}
octants |= e;
} else {
warnedAreaGrid[k] = 0;
}
}
}
if (ewCount > 0) {
ewTotal = (ewTotal + ewCount / 2) / ewCount;
}
if (nsCount > 0) {
nsTotal = (nsTotal + nsCount / 2) / nsCount;
}
meanMask = CoverageConstants.NS_MASK[nsTotal]
| CoverageConstants.EW_MASK[ewTotal];
return new EntityData(meanMask, coverageMask, octants);
}
/**
* Calculates the _ewGrid and _nsGrid via A1 ~~ mAgIc ~~
*/
private int[] awips1FinishAreaEntity() {
final double EXTREME_FRAC = 0.1;
final double MIN_EXTREME = 87;
final double MAX_EXTREME = 167;
int k = 0;
int ii, jj;
/*
* identify those points on the boundary of the entity so we can shrink
* from there
*/
int i_mean = 0;
int j_mean = 0;
int new_tot = 0;
int ii_mean = 0;
int jj_mean = 0;
int min_i = Integer.MAX_VALUE;
int min_j = Integer.MAX_VALUE;
int max_i = Integer.MIN_VALUE;
int max_j = Integer.MIN_VALUE;
for (jj = 0; jj < ny; jj++) {
k = nx * jj;
for (ii = 0; ii < nx; ii++, k++) {
// If the entity is not 1 then it's not part of the county or
// zone area.
if (countyOrZoneGrid[k] != 1) {
continue;
}
if (ii > max_i) {
max_i = ii;
}
if (ii < min_i) {
min_i = ii;
}
if (jj > max_j) {
max_j = jj;
}
if (jj < min_j) {
min_j = jj;
}
++new_tot;
ii_mean += ii;
jj_mean += jj;
}
}
/*
* restablish some things that might have changed since the first time
* they were calculated.
*/
// if (!outside) {
ii_mean /= new_tot;
jj_mean /= new_tot;
i_mean = ii_mean;
j_mean = jj_mean;
// }/*endif*/
/* assign correct base for directional computation */
// I changed this from ii_mean to this
double i_base = (min_i + max_i) / 2;
// I changed this from jj_mean to this
double j_base = (min_j + max_j) / 2;
/*
* calculate needed rotation factors for computation of amount each
* point is north and east of centroid
*/
double x_intcpg = 0.5;
double y_intcpg = 0.5;
double dx = 1, dy = 1;
double x = (i_base - x_intcpg);
double y = (j_base - y_intcpg);
// Below is some code from the original A1 code. I assumed that x_intcpg
// to be 0.5 to avoid porting all the methods in gelt_maker.c.
// xy_to_ll(&x,&y,&lat,&lon,&my_proj);
// lat01=lat+0.1;
// ll_to_xy(&lat01,&lon,&dx,&dy,&my_proj);
// dx -= x;
dy -= y;
double mag = Math.sqrt(dx * dx + dy * dy);
dx /= mag;
dy /= mag;
double erot_i = -dy;
double erot_j = -dx;
double nrot_i = dx;
double nrot_j = dy;
int[] ew_hist = new int[nx * ny];
int[] ns_hist = new int[nx * ny];
/* Calculate north/south & east/west offsets, create histogram of these. */
// TODO I did not fully implement the histograms as used in a1. Using
// the histograms created index out of bounds errors. If the field is
// unhappy with the portions, then porting the histograms needs to be
// re-investigated.
int ns1 = 0, ns2 = 0, ew1 = 0, ew2 = 0;
int np_n = 0, np_s = 0, np_e = 0, np_w = 0;
ns_hist[0] = 0;
ew_hist[0] = 0;
for (jj = min_j; jj < max_j; jj++) {
k = nx * jj + min_i;
for (ii = min_i; ii < max_i; ii++, k++) {
// If the entity is not 1 then it's not part of the county or
// zone area.
if (countyOrZoneGrid[k] != 1) {
continue;
}
double di = ii - i_base;
double dj = jj - j_base;
double dns = (int) (nrot_i * di + nrot_j * dj);
while (ns1 > dns) {
// ns_hist[--ns1] = 0;
--ns1;
}
while (ns2 < dns) {
// ns_hist[++ns2] = 0;
++ns2;
}
// ns_hist[(int) dns]++;
double dew = (int) (erot_i * di + erot_j * dj);
while (ew1 > dew) {
// ew_hist[--ew1] = 0;
--ew1;
}
while (ew2 < dew) {
// ew_hist[++ew2] = 0;
++ew2;
}
// ew_hist[(int) dew]++;
if (dew < 0) {
np_w++;
}
if (dew > 0) {
np_e++;
}
if (dns < 0) {
np_s++;
}
if (dns > 0) {
np_n++;
}
}/* end for */
}/* end for */
/*
* Transform n-s & e-w offsets into normalized distances north and
* south. This is done based on a preferred fraction of each area that
* is "extreme".
*/
// a lot of assumptions were made here. therefore, not everything in
// this part was fully ported.
double target = np_w * EXTREME_FRAC;
// for (ii = 0, k = ew1; k < -1 && ii < target; k++) {
// ii += ew_hist[k];
// }
// if (ii / target > 1.5) {
// k--;
// }
// if (k < ew1) {
// k = ew1;
// }
k = ew1;
double mu_w = (MIN_EXTREME - 127) / (k + 0.5);
target = np_e * EXTREME_FRAC;
// for (ii = 0, k = ew2; k > 1 && ii < target; k--) {
// ii += ew_hist[k];
// }
// if (ii / target > 1.5) {
// k++;
// }
// if (k > ew2) {
// k = ew2;
// }
k = ew2;
double mu_e = (MAX_EXTREME - 127) / (k - 0.5);
target = np_s * EXTREME_FRAC;
// for (ii = 0, k = ns1; k < -1 && ii < target; k++) {
// ii += ns_hist[k];
// }
// if (ii / target > 1.5) {
// k--;
// }
// if (k < ns1) {
// k = ns1;
// }
k = ns1;// TODO - REPLACE WITH ABOVE
double mu_s = (MIN_EXTREME - 127) / (k + 0.5);
target = np_n * EXTREME_FRAC;
// for (ii = 0, k = ns2; k > 1 && ii < target; k--) {
// ii += ns_hist[k];
// }
// if (ii / target > 1.5) {
// k++;
// }
// if (k > ns2) {
// k = ns2;
// }
k = ns2;
double mu_n = (MAX_EXTREME - 127) / (k - 0.5);
for (jj = min_j; jj < max_j; jj++) {
k = nx * jj + min_i;
for (ii = min_i; ii < max_i; ii++, k++) {
// If the entity is not 1 then it's not part of the county or
// zone area.
if (countyOrZoneGrid[k] != 1) {
ewGrid[k] = 0;
nsGrid[k] = 0;
continue;
}
double di = ii - i_base;
double dj = jj - j_base;
double dns = (int) (nrot_i * di + nrot_j * dj);
double dew = (int) (erot_i * di + erot_j * dj);
int c_ns2 = (int) (dns);
int c_ew2 = (int) (dew);
if (c_ew2 < 0) {
dx = c_ew2 * mu_w;
} else {
dx = c_ew2 * mu_e;
}
if (dx > 127) {
dx = 127;
}
if (dx < -127) {
dx = -127;
}
ewGrid[k] = (int) (127 + (int) (dx));
if (c_ns2 < 0) {
dy = c_ns2 * mu_s;
} else {
dy = c_ns2 * mu_n;
}
if (dy > 127) {
dy = 127;
}
if (dy < -127) {
dy = -127;
}
nsGrid[k] = (int) (127 + (int) (dy));
}
}
// System.out.println("-----------------------------------");
// printGrids(countyOrZoneGrid, min_i, max_i, min_j, max_j);
// System.out.println("-----------------------------------");
// printGrids(_currentArea, min_i, max_i, min_j, max_j);
// System.out.println("-------------- EAST WEST ---------------------");
// printGrids(ewGrid, min_i, max_i, min_j, max_j);
// System.out.println("-------------- NORTH SOUTH ---------------------");
// printGrids(nsGrid, min_i, max_i, min_j, max_j);
// System.out.println("north/south - east/west done");
return new int[] { min_i, max_i, min_j, max_j };
}
// For debugging and view the grid in ascii format.
private void printGrids(int[] grid, int min_i, int max_i, int min_j,
int max_j) {
int k = 0;
for (int jj = min_j; jj < max_j; jj++) {
k = nx * jj + min_i;
for (int ii = min_i; ii < max_i; ii++) {
System.out.print((int) grid[k]);
k++;
}
System.out.println("-");
}
}
// For debugging and view the grid in ascii format.
private void printGrids(byte[] grid, int min_i, int max_i, int min_j,
int max_j) {
int k = 0;
for (int jj = min_j; jj < max_j; jj++) {
k = nx * jj + min_i;
for (int ii = min_i; ii < max_i; ii++) {
System.out.print((int) grid[k]);
k++;
}
System.out.println("-");
}
}
}

View file

@ -0,0 +1,471 @@
/**
* 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.warngen.gis;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import com.raytheon.viz.warngen.gis.GisUtil.Direction;
import com.raytheon.viz.warngen.gui.WarngenLayer;
import com.vividsolutions.jts.geom.Geometry;
/**
* Port of A1 code that determines the portions of the county or zone
* descriptions, such as NORTHWEST.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 5, 2013 2177 jsanchez Initial creation
*
* </pre>
*
* @author jsanchez
* @version 1.0
*/
public class PortionsUtil {
private GridUtil gridUtil;
public PortionsUtil(WarngenLayer layer) throws Exception {
gridUtil = new GridUtil(layer, layer.getLocalGridGeometry(),
layer.getlocalToLatLon());
}
/**
* Determines the the appropriate portion description for the warnedArea
* intersecting the countyOrZone.
*
* @param entityID
* @param countyOrZone
* @param warnedArea
* @param useExtreme
* @return
* @throws Exception
*/
public EnumSet<Direction> getPortions(String entityID,
Geometry countyOrZone, Geometry warnedArea, boolean useExtreme)
throws Exception {
countyOrZone.getUserData();
EntityData entityData = gridUtil.calculateGrids(countyOrZone,
warnedArea);
EnumSet<Direction> portions = getAreaDesc(entityData.getMeanMask(),
entityData.getCoverageMask(), entityData.getOctants(),
useExtreme);
return suppressPortions(entityID, portions);
}
/**
* Looks up if the designated entity ID has an suppressed directions. For
* example, a county or zone may not need to include the north and sound
* direction description if it was included in the area.suppress file.
*
* @param entityID
* @param portions
* @return
*/
private EnumSet<Direction> suppressPortions(String entityID,
EnumSet<Direction> portions) {
Map<String, List<Direction>> suppressedCounties = SuppressMap
.getInstance().getAreas();
if (entityID != null && suppressedCounties != null
&& !suppressedCounties.isEmpty()) {
List<Direction> suppressedDirections = suppressedCounties
.get(entityID.toUpperCase());
if (suppressedDirections != null && !suppressedDirections.isEmpty()) {
portions.removeAll(suppressedDirections);
}
}
return portions;
}
/**
* Port from A1 code of GeoEntityLookupTable::getAreaDesc.
*
* @param meanMask
* @param areaMask
* @param octants
* @param exYes
*/
private static EnumSet<Direction> getAreaDesc(int meanMask, int areaMask,
int octants, boolean exYes) {
EnumSet<Direction> portions = EnumSet.noneOf(Direction.class);
// Test for case where we cannot do portions
if (meanMask == 0 || areaMask == 0) {
return portions;
}
// The next block of code is the original port of A1 code but prevented
// producing the correct result:
// Test for case where area is completely within one subsection.
// if (meanMask == areaMask) {
// return getPointDesc(meanMask, exYes);
// }
// Test for central by not being near adjacent borders.
if (octants == 0
|| ((octants & CoverageConstants.EXTREME_YES) == 0)
&& (meanMask & CoverageConstants.CENTER) == CoverageConstants.CENTER) {
portions.add(Direction.CENTRAL);
return portions;
}
if ((octants & 0xFFFF) == 0xFFFF) {
return portions;
}
// Identify quadrants in use, q is typical, qq is diagonal.
int xoctant = octants >> 8;
int xxoctant = octants >> 16;
int nn, ss, ee, ww, ne, nw, se, sw;
nn = ss = ee = ww = ne = nw = se = sw = 0;
int omerge = xxoctant | xoctant | octants;
if ((omerge & (CoverageConstants.NNE | CoverageConstants.ENE)) > 0) {
ne = 1;
}
if ((omerge & (CoverageConstants.SSE | CoverageConstants.ESE)) > 0) {
se = 1;
}
if ((omerge & (CoverageConstants.NNW | CoverageConstants.WNW)) > 0) {
nw = 1;
}
if ((omerge & (CoverageConstants.SSW | CoverageConstants.WSW)) > 0) {
sw = 1;
}
if ((omerge & (CoverageConstants.NNE | CoverageConstants.NNW)) > 0) {
nn = 1;
}
if ((omerge & (CoverageConstants.SSE | CoverageConstants.SSW)) > 0) {
ss = 1;
}
if ((omerge & (CoverageConstants.WNW | CoverageConstants.WSW)) > 0) {
ww = 1;
}
if ((omerge & (CoverageConstants.ENE | CoverageConstants.ESE)) > 0) {
ee = 1;
}
if ((areaMask & CoverageConstants.NORTH_SOUTH) == 0) {
nn = ss = ne = nw = se = sw = 0;
}
if ((areaMask & CoverageConstants.EAST_WEST) == 0) {
ee = ww = ne = nw = se = sw = 0;
}
int q = ne + nw + se + sw;
int qq = nn + ss + ee + ww;
// Identify extremes in use.
int nnx, ssx, eex, wwx;
nnx = ssx = eex = wwx = 0;
if ((areaMask & CoverageConstants.XNORTH) > 0) {
nnx = 1;
}
if ((areaMask & CoverageConstants.XSOUTH) > 0) {
ssx = 1;
}
if ((areaMask & CoverageConstants.XWEST) > 0) {
wwx = 1;
}
if ((areaMask & CoverageConstants.XEAST) > 0) {
eex = 1;
}
int xxx = nnx + ssx + eex + wwx;
// Modify masks based on whether we can use extreme.
if ((octants & CoverageConstants.EXTREME_NO) > 0
&& (areaMask & CoverageConstants.EXTREME) > 0) {
areaMask &= CoverageConstants.NOT_EXTREME;
meanMask &= CoverageConstants.NOT_EXTREME;
}
// Possible case of a stripe across the middle
if (q == 0) {
;// Only one direction encoded
} else if (q == 2 && nw == se || q == 2 && ne == sw || qq == 2
&& nn == ss || qq == 2 && ee == ww) {
if ((meanMask & CoverageConstants.CENTRAL) == CoverageConstants.CENTRAL
|| nnx == ssx && wwx == eex) {
portions.add(Direction.CENTRAL);
return portions;
}
return getPointDesc2(meanMask, exYes, nn, ss, ee, ww);
}
// Modify masks based on whether we can use central.
if (xxx > 2 || nnx != ssx && wwx != eex) {
areaMask &= CoverageConstants.NOT_CENTRAL;
meanMask &= CoverageConstants.NOT_CENTRAL;
}
// Another possible case of a stripe across the middle.
if (q == 4 && (meanMask & CoverageConstants.CENTER) > 0) {
portions.add(Direction.CENTRAL);
return portions;
}
// All quadrants in use.
if (q == 4 && qq == 4) {
return EnumSet.noneOf(Direction.class);
}
// Only one typical quadrant in use.
if (q == 1) {
// if (ne == 1) {
// portions.add(Direction.NORTH);
// portions.add(Direction.EAST);
// } else if (nw == 1) {
// portions.add(Direction.NORTH);
// portions.add(Direction.WEST);
// } else if (se == 1) {
// portions.add(Direction.SOUTH);
// portions.add(Direction.EAST);
// } else if (sw == 1) {
// portions.add(Direction.SOUTH);
// portions.add(Direction.WEST);
// }
// return portions;
return getPointDesc2(meanMask, exYes, nn, ss, ee, ww);
}
// Further modify masks based on whether we can use central.
if (xxx >= 2) {
areaMask &= CoverageConstants.NOT_CENTRAL;
meanMask &= CoverageConstants.NOT_CENTRAL;
}
// No more than two quadrants of any kind in use, or all quadrants.
if (q < 3 && qq < 3) {
if (nnx != ssx && wwx != eex
|| (meanMask & CoverageConstants.CENTRAL) > 0) {
return getPointDesc2(meanMask, exYes, nn, ss, ee, ww);
} else {
return getPointDesc2(areaMask, exYes, nn, ss, ee, ww);
}
}
// Three typical quadrants in use.
if (q == 3 && qq != 3) {
if (ne == 0) {
// The next line is the original port of A1 code but prevented
// producing the correct result:
// if (ne == 0 && (xxoctant & (SSW | WSW)) > 0) {
portions.add(Direction.SOUTH);
portions.add(Direction.WEST);
} else if (se == 0) {
// The next line is the original port of A1 code but prevented
// producing the correct result:
// } else if (se == 0 && (xxoctant & (NNW | WNW)) > 0) {
portions.add(Direction.NORTH);
portions.add(Direction.WEST);
} else if (nw == 0) {
// The next line is the original port of A1 code but prevented
// producing the correct result:
// } else if (nw == 0 && (xxoctant & (SSE | ESE)) > 0) {
portions.add(Direction.SOUTH);
portions.add(Direction.EAST);
} else if (sw == 0) {
// The next line is the original port of A1 code but prevented
// producing the correct result:
// } else if (sw == 0 && (xxoctant & (NNE | ENE)) > 0) {
portions.add(Direction.NORTH);
portions.add(Direction.EAST);
}
// The next line is the original port of A1 code but prevented
// producing the correct result:
// return getPointDesc(meanMask, exYes);
}
// Three diagonal quadrants in use.
if (qq == 3 && portions.isEmpty()) {
if (nn == 0) {
portions.add(Direction.SOUTH);
} else if (ss == 0) {
portions.add(Direction.NORTH);
} else if (ww == 0) {
portions.add(Direction.EAST);
} else if (ee == 0) {
portions.add(Direction.WEST);
}
}
// add extreme for three quadrant case.
if (!portions.isEmpty()) {
if (exYes && ((areaMask & CoverageConstants.EXTREME)) > 0) {
portions.add(Direction.EXTREME);
}
return portions;
}
// All of either type of quadrant in use.
if (q == 4 || qq == 4) {
return EnumSet.noneOf(Direction.class);
}
// Case of a pure simple direction.
nn = areaMask & CoverageConstants.NORTHERN;
ss = areaMask & CoverageConstants.SOUTHERN;
ee = areaMask & CoverageConstants.EASTERN;
ww = areaMask & CoverageConstants.WESTERN;
if (ss > 0 && nn > 0 || q == 0) {
if (ee == 0 && ww > 0) {
portions.add(Direction.WEST);
}
if (ww == 0 && ee > 0) {
portions.add(Direction.EAST);
}
} else if (ee > 0 && ww > 0 || q == 0) {
if (nn == 0 && ss > 0) {
portions.add(Direction.SOUTH);
}
if (ss == 0 && nn > 0) {
portions.add(Direction.NORTH);
}
}
// add extreme for simple direction case.
if (!portions.isEmpty()) {
if (exYes && ((areaMask & CoverageConstants.EXTREME)) > 0) {
portions.add(Direction.EXTREME);
}
return portions;
}
// Catch with the point descriptor one last time
return getPointDesc2(meanMask, exYes, nn, ss, ee, ww);
}
/**
* Port from A1 code of GeoEntityLookupTable::getPointDesc.
*
* @param mask
* @param exYes
* @return
*/
private static EnumSet<Direction> getPointDesc(int mask, boolean exYes) {
EnumSet<Direction> portions = EnumSet.noneOf(Direction.class);
if (mask == 0) {
return portions;
}
int cc = mask & CoverageConstants.CENTRAL;
if (cc == CoverageConstants.CENTRAL) {
portions.add(Direction.CENTRAL);
return portions;
}
if ((mask & CoverageConstants.NORTH_SOUTH) == 0) {
;
} else if ((mask & CoverageConstants.SOUTHERN) == (mask & CoverageConstants.NORTH_SOUTH)) {
portions.add(Direction.SOUTH);
} else if ((mask & CoverageConstants.NORTHERN) == (mask & CoverageConstants.NORTH_SOUTH)) {
portions.add(Direction.NORTH);
}
if ((mask & CoverageConstants.EAST_WEST) == 0) {
;
} else if ((mask & CoverageConstants.WESTERN) == (mask & CoverageConstants.EAST_WEST)) {
portions.add(Direction.WEST);
} else if ((mask & CoverageConstants.EASTERN) == (mask & CoverageConstants.EAST_WEST)) {
portions.add(Direction.EAST);
}
if (portions.isEmpty()) {
return portions;
}
if (cc != 0) {
portions.add(Direction.CENTRAL);
}
if (exYes && ((int) (mask & CoverageConstants.EXTREME) > 0)) {
portions.add(Direction.EXTREME);
}
return portions;
}
/**
* This method is not a direct port from A1. The original getPointDesc did
* not produce the expected results. This method is a modified version of
* getPointDesct that uses the calculated qq values instead of just the
* meanMask.
*
* @param mask
* @param exYes
* @return
*/
private static EnumSet<Direction> getPointDesc2(int mask, boolean exYes,
int nn, int ss, int ee, int ww) {
EnumSet<Direction> portions = EnumSet.noneOf(Direction.class);
if (mask == 0) {
return portions;
}
int counter = 0;
if (nn > 0 && ss > 0) {
;
} else if (ss > 0) {
portions.add(Direction.SOUTH);
counter++;
} else if (nn > 0) {
portions.add(Direction.NORTH);
counter++;
}
if (ee > 0 && ww > 0) {
;
} else if (ww > 0) {
portions.add(Direction.WEST);
counter++;
} else if (ee > 0) {
portions.add(Direction.EAST);
counter++;
}
if (portions.isEmpty()) {
return portions;
}
int cc = mask & CoverageConstants.CENTRAL;
boolean useCentral = counter < 2;
if (useCentral && cc != 0) {
portions.add(Direction.CENTRAL);
}
if (exYes && ((int) (mask & CoverageConstants.EXTREME) > 0)) {
portions.add(Direction.EXTREME);
}
return portions;
}
}

View file

@ -17,7 +17,7 @@
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.viz.warngen.suppress;
package com.raytheon.viz.warngen.gis;
import java.io.BufferedReader;
import java.io.File;
@ -25,7 +25,10 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -38,9 +41,11 @@ import com.raytheon.uf.common.localization.PathManagerFactory;
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.viz.warngen.gis.GisUtil.Direction;
/**
* TODO Add Description
* Creates a map of all the site's area suppress files.
*
* <pre>
*
@ -48,6 +53,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Aug 2, 2010 jsanchez Initial creation
* Aug 15,2013 2177 jsanchez Refactored.
*
* </pre>
*
@ -66,16 +72,26 @@ public class SuppressMap {
private static final Pattern ugcPattern = Pattern
.compile("[A-Z]{2}[CZ][0-9]{3}");
public static final String NORTH_SOUTH = "NS";
private static final List<Direction> NORTH_SOUTH = Arrays.asList(
Direction.NORTH, Direction.SOUTH);
public static final String EAST_WEST = "EW";
private static final List<Direction> EAST_WEST = Arrays.asList(
Direction.EAST, Direction.WEST);
public static final String NONE = "NONE";
private static final List<Direction> ALL = Arrays.asList(Direction.NORTH,
Direction.SOUTH, Direction.EAST, Direction.WEST, Direction.CENTRAL,
Direction.EXTREME);
public static final String ALL = "ALL";
private static Map<String, Map<String, List<Direction>>> suppressMap = new HashMap<String, Map<String, List<Direction>>>();
private Map<String, String> suppressMap = new HashMap<String, String>();
private SuppressMap() {
}
/**
*
* @return an instance of the SuppressMap object.
*/
public static SuppressMap getInstance() {
if (instance == null) {
instance = new SuppressMap();
@ -83,64 +99,82 @@ public class SuppressMap {
return instance;
}
private SuppressMap() {
readFile();
/**
* Returns the suppressed area map for the current localized site.
*
* @return
*/
public Map<String, List<Direction>> getAreas() {
String threeLetterSiteID = LocalizationManager.getInstance()
.getCurrentSite();
Map<String, List<Direction>> areas = suppressMap.get(threeLetterSiteID);
if (areas == null) {
areas = new HashMap<String, List<Direction>>();
IPathManager pm = PathManagerFactory.getPathManager();
LocalizationContext lc = pm.getContext(
LocalizationType.COMMON_STATIC, LocalizationLevel.SITE);
File file = pm.getFile(lc, AREA_SUPPRESS_FILENAME);
loadFile(file, areas);
}
return areas;
}
private void readFile() {
// load site
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext lc = pathMgr.getContext(
LocalizationType.COMMON_STATIC, LocalizationLevel.SITE);
File file = pathMgr.getFile(lc, AREA_SUPPRESS_FILENAME);
loadFile(file, suppressMap);
}
private void loadFile(File file, Map<String, String> aliasMap) {
/**
* Loads the areas map with the suppress information in the file
*
* @param file
* @param areas
*/
private void loadFile(File file, Map<String, List<Direction>> areas) {
if ((file != null) && file.exists()) {
Matcher m = null;
BufferedReader fis = null;
try {
BufferedReader fis = new BufferedReader(new InputStreamReader(
fis = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = null;
try {
while ((line = fis.readLine()) != null) {
m = ugcPattern.matcher(line);
if (m.find()) {
String dataKey = m.group();
String data = ALL;
List<Direction> suppressedDirections = new ArrayList<Direction>();
String ugc = m.group();
if (line.indexOf("ns") > 5) {
data = NORTH_SOUTH;
suppressedDirections = NORTH_SOUTH;
} else if (line.indexOf("ew") > 5) {
data = EAST_WEST;
suppressedDirections = EAST_WEST;
} else {
suppressedDirections = ALL;
}
aliasMap.put(dataKey, data);
areas.put(ugc, suppressedDirections);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block. Please revise as
// appropriate.
statusHandler.handle(Priority.PROBLEM,
"Could not read counties file: "
+ AREA_SUPPRESS_FILENAME, e);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block. Please revise as
// appropriate.
statusHandler.handle(Priority.PROBLEM,
"Failed to find counties file: "
+ AREA_SUPPRESS_FILENAME, e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
statusHandler.handle(Priority.PROBLEM,
"Error trying to close buffered reader ", e);
}
}
}
}
}
public String getType(String key) {
if (suppressMap.containsKey(key)) {
return suppressMap.get(key);
} else {
return NONE;
}
}
}

View file

@ -20,7 +20,7 @@
package com.raytheon.viz.warngen.gui;
import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord;
import com.raytheon.uf.common.dataplugin.warning.WarningRecord;
import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction;
import com.raytheon.uf.common.time.SimulatedTime;
import com.raytheon.uf.common.time.util.TimeUtil;
@ -37,20 +37,21 @@ import com.raytheon.uf.common.time.util.TimeUtil;
* May 7, 2013 1973 rferrel Changes to properly display Issue Time.
* Jul 22, 2013 2176 jsanchez Added EMER to the display string in the update list.
* Aug 7, 2013 2243 jsanchez Set all the attributes of an AbstractWarningRecord and added an expiration string. Removed calendar object.
* Aug 15,2013 2243 jsanchez Improved the expiration string off by one minute. Fixed for practice mode.
* Aug 15,2013 2243 jsanchez Improved the expiration string off by one minute.
* </pre>
*
* @author rferrel
* @version 1.0
*/
public class FollowupData extends WarningRecord {
public class FollowupData extends AbstractWarningRecord {
private static final long serialVersionUID = 1L;
/**
* String displayed in the drop down update list.
*/
private String displayString;
private final String displayString;
/**
* String used to test if this object is equivalent to one of the updated
@ -61,10 +62,10 @@ public class FollowupData extends WarningRecord {
/**
* Information string used when the follow up is no longer valid or allowed.
*/
private String expirationString;
private final String expirationString;
public FollowupData(WarningAction action, AbstractWarningRecord record) {
super((WarningRecord) record);
super(record);
setAct(action.toString());
displayString = createDisplayString(action, record);
@ -191,4 +192,13 @@ public class FollowupData extends WarningRecord {
return expirationString;
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.common.dataplugin.PluginDataObject#getPluginName()
*/
@Override
public String getPluginName() {
return "followupwarning";
}
}

View file

@ -26,6 +26,7 @@ import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.tools.GenericToolsResourceData;
import com.raytheon.uf.viz.core.rsc.tools.action.AbstractGenericToolAction;
import com.raytheon.viz.ui.input.EditableManager;
/**
* Simple action for loading the warngen layer
@ -38,6 +39,7 @@ import com.raytheon.uf.viz.core.rsc.tools.action.AbstractGenericToolAction;
* May 4, 2010 mschenke Initial creation
* Oct 10, 2010 6990 Qinglu Lin Used D. Friedman short solution,
* with minor changes.
* Aug 15, 2013 DR 16418 D. Friedman Always show the dialog.
*
* </pre>
*
@ -65,16 +67,16 @@ public class WarngenAction extends AbstractGenericToolAction<WarngenLayer> {
for (IDisplayPane pane : getSelectedPanes()) {
for (ResourcePair rp : pane.getDescriptor().getResourceList()) {
if (rp.getResource() instanceof WarngenLayer) {
EditableManager.makeEditable(rp.getResource(), true);
((WarngenLayer) rp.getResource())
.showDialog(((WarngenLayer) rp.getResource())
.isEditable());
.showDialog(true);
return (WarngenLayer) rp.getResource();
}
}
}
WarngenLayer layer = super.getResource(loadProperties, descriptor);
layer.createDialog();
layer.showDialog(true);
return layer;
}
}

View file

@ -52,9 +52,11 @@ import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
@ -82,6 +84,7 @@ import com.raytheon.viz.texteditor.util.VtecUtil;
import com.raytheon.viz.ui.EditorUtil;
import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
import com.raytheon.viz.ui.dialogs.ICloseCallback;
import com.raytheon.viz.ui.input.EditableManager;
import com.raytheon.viz.warngen.Activator;
import com.raytheon.viz.warngen.WarngenConstants;
import com.raytheon.viz.warngen.comm.WarningSender;
@ -144,6 +147,7 @@ import com.vividsolutions.jts.geom.Polygon;
* Jul 16, 2013 DR 16387 Qinglu Lin Reset totalSegments for each followup product.
* Jul 29, 2013 DR 16352 D. Friedman Move 'result' to okPressed().
* Aug 6, 2013 2243 jsanchez Refreshed the follow up list every minute.
* Aug 15, 2013 DR 16418 D. Friedman Make dialog visibility match editable state.
* </pre>
*
* @author chammack
@ -306,6 +310,14 @@ public class WarngenDialog extends CaveSWTDialog implements
*/
@Override
protected void initializeComponents(Shell shell) {
shell.addListener(SWT.Close, new Listener() {
@Override
public void handleEvent(Event event) {
event.doit = false;
closePressed();
}
});
Composite mainComposite = new Composite(shell, SWT.NONE);
GridLayout gl = new GridLayout(1, false);
gl.verticalSpacing = 2;
@ -1256,7 +1268,8 @@ public class WarngenDialog extends CaveSWTDialog implements
* Action for Close button
*/
private void closePressed() {
close();
EditableManager.makeEditable(warngenLayer, false);
hide();
}
/**
@ -2194,6 +2207,8 @@ public class WarngenDialog extends CaveSWTDialog implements
}
// Move above parent shell if we are showing it
shell.moveAbove(getParent());
} else {
shell.setVisible(false);
}
}
}

View file

@ -49,6 +49,9 @@ import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.PlatformUI;
import org.geotools.coverage.grid.GeneralGridEnvelope;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.GeodeticCalculator;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
@ -57,7 +60,6 @@ import org.opengis.referencing.operation.MathTransform;
import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord;
import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction;
import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration;
import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration.AreaType;
import com.raytheon.uf.common.dataplugin.warning.config.BulletActionGroup;
import com.raytheon.uf.common.dataplugin.warning.config.DialogConfiguration;
import com.raytheon.uf.common.dataplugin.warning.config.GridSpacing;
@ -185,6 +187,7 @@ import com.vividsolutions.jts.io.WKTReader;
* 07/26/2013 DR 16376 Qinglu Lin Moved adjustVertex() and computeSlope() to PolygonUtil; removed calculateDistance();
* updated AreaHatcher's run().
* 07/26/2013 DR 16450 D. Friedman Fix logic errors when frame count is one.
* 08/19/2013 2177 jsanchez Set a GeneralGridGeometry object in the GeospatialDataList.
* </pre>
*
* @author mschenke
@ -212,24 +215,28 @@ public class WarngenLayer extends AbstractStormTrackResource {
IExtent localExtent;
int nx, ny;
GeneralGridGeometry localGridGeometry;
}
private static class GeospatialDataAccessor {
GeospatialDataList geoData;
AreaSourceConfiguration areaConfig;
public GeospatialDataAccessor(GeospatialDataList geoData,
AreaSourceConfiguration areaConfig) {
if (geoData == null || areaConfig == null) {
throw new IllegalArgumentException("GeospatialDataAccessor must not be null");
throw new IllegalArgumentException(
"GeospatialDataAccessor must not be null");
}
this.geoData = geoData;
this.areaConfig = areaConfig;
}
/**
* Build the geometry area that intersects the cwa filter for the polygon in
* local projection space
* Build the geometry area that intersects the cwa filter for the
* polygon in local projection space
*
* @param polygon
* polygon to intersect with in lat/lon space
@ -243,8 +250,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
PreparedGeometry prepGeom = (PreparedGeometry) r.attributes
.get(GeospatialDataList.LOCAL_PREP_GEOM);
try {
Geometry intersection = GeometryUtil.intersection(polygon,
prepGeom);
Geometry intersection = GeometryUtil.intersection(
polygon, prepGeom);
if (intersection.isEmpty()) {
continue;
}
@ -407,7 +414,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
try {
warningPolygon = PolygonUtil.removeDuplicateCoordinate(warningPolygon);
warningPolygon = PolygonUtil
.removeDuplicateCoordinate(warningPolygon);
Polygon hatched = polygonUtil.hatchWarningArea(
warningPolygon,
removeCounties(warningArea,
@ -425,27 +433,37 @@ public class WarngenLayer extends AbstractStormTrackResource {
LinearRing lr = gf.createLinearRing(coords);
hatchedArea = gf.createPolygon(lr, null);
int adjustPolygon_counter = 0;
while (!hatchedArea.isValid() && adjustPolygon_counter < 1) {
System.out.println("Calling adjustPolygon #" + adjustPolygon_counter);
while (!hatchedArea.isValid()
&& adjustPolygon_counter < 1) {
System.out.println("Calling adjustPolygon #"
+ adjustPolygon_counter);
PolygonUtil.adjustPolygon(coords);
PolygonUtil.round(coords, 2);
coords = PolygonUtil.removeDuplicateCoordinate(coords);
coords = PolygonUtil.removeOverlaidLinesegments(coords);
coords = PolygonUtil
.removeDuplicateCoordinate(coords);
coords = PolygonUtil
.removeOverlaidLinesegments(coords);
lr = gf.createLinearRing(coords);
hatchedArea = gf.createPolygon(lr, null);
adjustPolygon_counter += 1;
}
int counter = 0;
if (!hatchedArea.isValid() && counter < 2) {
System.out.println("calling adjustVertex & alterVertexes: loop #" + counter);
System.out
.println("calling adjustVertex & alterVertexes: loop #"
+ counter);
int adjustVertex_counter = 0;
lr = gf.createLinearRing(coords);
hatchedArea = gf.createPolygon(lr, null);
while (!hatchedArea.isValid() && adjustVertex_counter < 5) {
System.out.println(" Calling adjustVertex #" + adjustVertex_counter);
while (!hatchedArea.isValid()
&& adjustVertex_counter < 5) {
System.out.println(" Calling adjustVertex #"
+ adjustVertex_counter);
coords = PolygonUtil.adjustVertex(coords);
coords = PolygonUtil.removeDuplicateCoordinate(coords);
coords = PolygonUtil.removeOverlaidLinesegments(coords);
coords = PolygonUtil
.removeDuplicateCoordinate(coords);
coords = PolygonUtil
.removeOverlaidLinesegments(coords);
lr = gf.createLinearRing(coords);
hatchedArea = gf.createPolygon(lr, null);
adjustVertex_counter += 1;
@ -453,10 +471,14 @@ public class WarngenLayer extends AbstractStormTrackResource {
int inner_counter = 0;
System.out.println("");
while (!hatchedArea.isValid() && inner_counter < 5) {
System.out.println(" Calling alterVertexes #" + inner_counter);
System.out
.println(" Calling alterVertexes #"
+ inner_counter);
coords = PolygonUtil.alterVertexes(coords);
coords = PolygonUtil.removeDuplicateCoordinate(coords);
coords = PolygonUtil.removeOverlaidLinesegments(coords);
coords = PolygonUtil
.removeDuplicateCoordinate(coords);
coords = PolygonUtil
.removeOverlaidLinesegments(coords);
lr = gf.createLinearRing(coords);
hatchedArea = gf.createPolygon(lr, null);
inner_counter += 1;
@ -674,8 +696,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
displayState.angle = 0;
displayState.speed = 0;
} else if (checkStormTrackData(data = ToolsDataManager
.getInstance()
.getStormTrackData())) {
.getInstance().getStormTrackData())) {
displayState.angle = adjustAngle(data.getMotionDirection());
displayState.speed = knotToMeterPerSec.convert(data
.getMotionSpeed());
@ -995,8 +1016,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
if (config != null) {
init(config);
displayState.setInitiallyMotionless(
this.configuration.isTrackEnabled() == false
displayState.setInitiallyMotionless(this.configuration
.isTrackEnabled() == false
|| this.configuration.getPathcastConfig() == null);
}
}
@ -1044,9 +1065,11 @@ public class WarngenLayer extends AbstractStormTrackResource {
+ (System.currentTimeMillis() - t0) + "ms");
}
/** Adds geospatial data to siteMap and timezoneMap for the given
* template configuration. This must not have any site effects on the
* currently loaded template or the current product being edited.
/**
* Adds geospatial data to siteMap and timezoneMap for the given template
* configuration. This must not have any site effects on the currently
* loaded template or the current product being edited.
*
* @param config
*/
private void loadGeodataForConfiguration(WarngenConfiguration config) {
@ -1083,7 +1106,6 @@ public class WarngenLayer extends AbstractStormTrackResource {
Coordinate c = new GeometryFactory()
.buildGeometry(geoms).getCentroid()
.getCoordinate();
gData.latLonToLocal = MapUtil
.getTransformFromLatLon(MapUtil
.constructStereographic(
@ -1146,6 +1168,18 @@ public class WarngenLayer extends AbstractStormTrackResource {
gData.nx = nx;
gData.ny = ny;
GeneralGridEnvelope range = new GeneralGridEnvelope(
new int[] { 0, 0 }, new int[] { gData.nx,
gData.ny }, false);
GeneralEnvelope ge = new GeneralEnvelope(new double[] {
gData.localExtent.getMinX(),
gData.localExtent.getMaxY() }, new double[] {
gData.localExtent.getMaxX(),
gData.localExtent.getMinY() });
gData.localGridGeometry = new GeneralGridGeometry(
range, ge);
System.out.println("Time to lookup geospatial data "
+ (System.currentTimeMillis() - tq0));
siteMap.put(currKey, gData);
@ -1188,6 +1222,14 @@ public class WarngenLayer extends AbstractStormTrackResource {
return new GeospatialData[0];
}
public GeneralGridGeometry getLocalGridGeometry() {
return geoData.localGridGeometry;
}
public MathTransform getlocalToLatLon() {
return geoData.localToLatLon;
}
private GeospatialDataList getGeodataList(String areaSource,
String localizedSite) {
String key = areaSource + "." + localizedSite;
@ -1303,7 +1345,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
* Returns a set of UGCs for each area in the CWA that intersects the given
* polygon.
*/
public Set<String> getUgcsForCountyWatches(Polygon polygon) throws Exception {
public Set<String> getUgcsForCountyWatches(Polygon polygon)
throws Exception {
GeospatialDataAccessor gda = getCountyGeospatialDataAcessor();
Set<String> ugcs = new HashSet<String>();
for (String fips : gda.getAllFipsInArea(gda.buildArea(polygon))) {
@ -1321,17 +1364,20 @@ public class WarngenLayer extends AbstractStormTrackResource {
return ugcs;
}
private GeospatialDataAccessor getCountyGeospatialDataAcessor() throws Exception {
private GeospatialDataAccessor getCountyGeospatialDataAcessor()
throws Exception {
GeospatialDataList gdl = searchCountyGeospatialDataAccessor();
if (gdl == null) {
// Cause county geospatial data to be loaded
// TODO: Should not be referencing tornadoWarning.
WarngenConfiguration torConfig = WarngenConfiguration.loadConfig("tornadoWarning", getLocalizedSite());
WarngenConfiguration torConfig = WarngenConfiguration.loadConfig(
"tornadoWarning", getLocalizedSite());
loadGeodataForConfiguration(torConfig);
gdl = searchCountyGeospatialDataAccessor();
}
// TODO: There should be some way to get the "county" configuration by name
// TODO: There should be some way to get the "county" configuration by
// name
// independent of a template
AreaSourceConfiguration areaConfig = new AreaSourceConfiguration();
areaConfig.setFipsField("FIPS");
@ -1341,7 +1387,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
private GeospatialDataList searchCountyGeospatialDataAccessor() {
synchronized (siteMap) {
for (Map.Entry<String, GeospatialDataList> entry : siteMap.entrySet()) {
for (Map.Entry<String, GeospatialDataList> entry : siteMap
.entrySet()) {
String[] keyParts = entry.getKey().split("\\.");
if (keyParts.length == 2
&& "county".equalsIgnoreCase(keyParts[0])
@ -1938,8 +1985,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
return;
}
if (warningAction == null || warningAction == WarningAction.NEW) {
if ((configuration.isTrackEnabled() == false ||
configuration.getPathcastConfig() == null)
if ((configuration.isTrackEnabled() == false || configuration
.getPathcastConfig() == null)
&& !this.displayState.isNonstationary()
&& this.displayState.displayType != DisplayType.POLY) {
createSquare();
@ -2271,8 +2318,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
Point point = displayState.dragMePoint;
if (motdir != null && motspd != null &&
(motspd != 0 || configuration.isTrackEnabled())) {
if (motdir != null && motspd != null
&& (motspd != 0 || configuration.isTrackEnabled())) {
displayState.setInitiallyMotionless(false);
displayState.angle = adjustAngle(motdir);
displayState.speed = knotToMeterPerSec.convert(motspd);
@ -2325,10 +2372,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
if (m.find()) {
int hour = Integer.parseInt(m.group(1));
int minute = Integer.parseInt(m.group(2));
frameTime = TimeUtil.timeOfDayToAbsoluteTime(
hour * TimeUtil.SECONDS_PER_HOUR +
minute * TimeUtil.SECONDS_PER_MINUTE,
warnRecord.getIssueTime());
frameTime = TimeUtil.timeOfDayToAbsoluteTime(hour
* TimeUtil.SECONDS_PER_HOUR + minute
* TimeUtil.SECONDS_PER_MINUTE, warnRecord.getIssueTime());
} else {
frameTime = warnRecord.getIssueTime();
}
@ -2376,8 +2422,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
FramesInfo info = descriptor.getFramesInfo();
int currentFrame = trackUtil.getCurrentFrame(info);
int frameCount = trackUtil.getFrameCount(info);
if (currentFrame == frameCount - 1
|| ! displayState.isNonstationary()) {
if (currentFrame == frameCount - 1 || !displayState.isNonstationary()) {
return coordinate;
}
DataTime[] datatimes = trackUtil.getDataTimes(info);
@ -2686,7 +2731,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
getFips(f));
if (tmp.isEmpty()) {
String fip = getFips(f);
if (fip != null && uniqueFip != null && fip.equals(uniqueFip)) {
if (fip != null && uniqueFip != null
&& fip.equals(uniqueFip)) {
updateWarnedAreas(true);
}
break;
@ -2769,8 +2815,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
if (areaHatcher != null) {
Polygon polygon = state.getWarningPolygon();
polygon = tryToIntersectWithOriginalPolygon(polygon);
areaHatcher.hatchArea(polygon,
state.getWarningArea(),
areaHatcher.hatchArea(polygon, state.getWarningArea(),
state.getOldWarningPolygon());
}
}

View file

@ -65,6 +65,7 @@ import com.vividsolutions.jts.geom.Polygon;
* when c2 is null for "case SINGLE_POINT" in move().
* Mar 28, 2013 DR 15974 D. Friedman Do not track removed GIDs.
* Jun 25, 2013 DR 16013 Qinglu Lin Called setUniqueFip() in handleMouseUp().
* Aug 15, 2013 DR 16418 D. Friedman Only raise dialog if editable. Don't call featureEdit if not editable.
*
* </pre>
*
@ -131,7 +132,9 @@ public class WarngenUIManager extends InputAdapter {
*/
@Override
public boolean handleMouseDown(int x, int y, int button) {
warngenLayer.showDialog(true);
if (warngenLayer.isEditable()) {
warngenLayer.showDialog(true);
}
lastMouseX = x;
lastMouseY = y;
if (!handleInput || warngenLayer.isBoxEditable() == false) {
@ -207,7 +210,7 @@ public class WarngenUIManager extends InputAdapter {
return super.handleMouseUp(x, y, mouseButton);
}
if (mouseButton == 3 && menuMove == false) {
if (mouseButton == 3 && menuMove == false && warngenLayer.isEditable()) {
Coordinate c = container.translateClick(x, y);
WarngenUIState state = warngenLayer.getWarngenState();
boolean geomsEqual = true;

View file

@ -98,6 +98,7 @@ import com.raytheon.viz.warngen.gis.Area;
import com.raytheon.viz.warngen.gis.ClosestPointComparator;
import com.raytheon.viz.warngen.gis.GisUtil;
import com.raytheon.viz.warngen.gis.PathCast;
import com.raytheon.viz.warngen.gis.PortionsUtil;
import com.raytheon.viz.warngen.gis.Wx;
import com.raytheon.viz.warngen.gui.BackupData;
import com.raytheon.viz.warngen.gui.FollowupData;
@ -154,6 +155,7 @@ import com.vividsolutions.jts.io.WKTReader;
* May 10, 2013 1951 rjpeter Updated ugcZones references
* May 30, 2013 DR 16237 D. Friedman Fix watch query.
* Jun 18, 2013 2118 njensen Only calculate pathcast if it's actually used
* Aug 19, 2013 2177 jsanchez Passed PortionsUtil to Area class.
* </pre>
*
* @author njensen
@ -301,17 +303,18 @@ public class TemplateRunner {
AffectedAreas[] cancelareas = null;
Map<String, Object> intersectAreas = null;
Wx wx = null;
Area area = new Area(new PortionsUtil(warngenLayer));
long wwaMNDTime = 0l;
try {
t0 = System.currentTimeMillis();
areas = Area.findAffectedAreas(config, warnPolygon, warningArea,
areas = area.findAffectedAreas(config, warnPolygon, warningArea,
threeLetterSiteId);
System.out.println("Time to get areas = "
+ (System.currentTimeMillis() - t0));
context.put(config.getHatchedAreaSource().getVariable(), areas);
t0 = System.currentTimeMillis();
intersectAreas = Area.findInsectingAreas(config, warnPolygon,
intersectAreas = area.findInsectingAreas(config, warnPolygon,
warningArea, threeLetterSiteId, warngenLayer);
System.out.println("Time to get intersecting areas = "
+ (System.currentTimeMillis() - t0));
@ -324,10 +327,11 @@ public class TemplateRunner {
double minSize = 1.0E-3d;
if ((areas != null) && (areas.length > 0)) {
Set<String> timeZones = new HashSet<String>();
for (AffectedAreas area : areas) {
if (area.getTimezone() != null) {
for (AffectedAreas affectedAreas : areas) {
if (affectedAreas.getTimezone() != null) {
// Handles counties that span two time zones
String oneLetterTimeZones = area.getTimezone().trim();
String oneLetterTimeZones = affectedAreas.getTimezone()
.trim();
oneLetterTZ = new String[oneLetterTimeZones.length()];
if (oneLetterTimeZones.length() == 1) {
timeZones.add(String.valueOf(oneLetterTimeZones
@ -799,14 +803,14 @@ public class TemplateRunner {
Geometry removedAreas = warngenLayer.getWarningAreaForGids(
oldGids, oldWarningArea);
if (removedAreas.isEmpty() == false) {
cancelareas = Area.findAffectedAreas(config,
cancelareas = area.findAffectedAreas(config,
oldWarn.getGeometry(), removedAreas,
threeLetterSiteId);
for (int i = 0; i < cancelareas.length; i++) {
for (AffectedAreas area : areas) {
for (AffectedAreas affectedAreas : areas) {
if ((cancelareas[i] != null)
&& cancelareas[i].getFips().equals(
area.getFips())) {
affectedAreas.getFips())) {
cancelareas[i] = null;
}
}
@ -824,7 +828,7 @@ public class TemplateRunner {
// This may not be efficient enough. Is it possible that
// a removed intersected county be in the affected
// intersected county. Need an example to fully test.
Map<String, Object> intersectRemovedAreas = Area
Map<String, Object> intersectRemovedAreas = area
.findInsectingAreas(config, warnPolygon,
removedAreas, threeLetterSiteId,
warngenLayer);

View file

@ -0,0 +1,22 @@
#!/bin/bash
# DR #2275 - this script is needd to add the dataURI column back into the
# bufrmosavn and bufrmoshpc tables.
PSQL="/awips2/psql/bin/psql"
${PSQL} -U awips -d metadata -c "ALTER TABLE bufrmosavn ADD COLUMN datauri character varying(255);"
if [ $? -ne 0 ]; then
echo "ERROR: Failed to drop dataURI column for bufrmosavn"
echo "FATAL: The update has failed."
exit 1
fi
${PSQL} -U awips -d metadata -c "ALTER TABLE bufrmoshpc ADD COLUMN datauri character varying(255);"
if [ $? -ne 0 ]; then
echo "ERROR: Failed to add dataURI column for bufrmoshpc"
echo "FATAL: The update has failed."
exit 1
fi
${PSQL} -U awips -d metadata -c "VACUUM FULL ANALYZE bufrmosavn"
${PSQL} -U awips -d metadata -c "VACUUM FULL ANALYZE bufrmoshpc"
echo "INFO: dataURI columns added successfully"

File diff suppressed because it is too large Load diff

View file

@ -19,6 +19,9 @@
**/
package com.raytheon.edex.plugin.bufrmos.common;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@ -48,6 +51,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
* May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject.
* May 14, 2013 1869 bsteffen Remove DataURI column from bufrmos.
* Aug 19, 2013 2275 bsteffen Add dataURI column back into bufrmos
* types.
*
* </pre>
*
@ -77,4 +82,11 @@ public class BufrMosAvnData extends BufrMosData {
return MOSType.AVN;
}
@Override
@Column
@Access(AccessType.PROPERTY)
public String getDataURI() {
return super.getDataURI();
}
}

View file

@ -19,6 +19,9 @@
**/
package com.raytheon.edex.plugin.bufrmos.common;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@ -48,6 +51,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
* May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject.
* May 14, 2013 1869 bsteffen Remove DataURI column from bufrmos.
* Aug 19, 2013 2275 bsteffen Add dataURI column back into bufrmos
* types.
*
* </pre>
*
@ -77,4 +82,11 @@ public class BufrMosHpcData extends BufrMosData {
return MOSType.HPC;
}
@Override
@Column
@Access(AccessType.PROPERTY)
public String getDataURI() {
return super.getDataURI();
}
}

View file

@ -1292,7 +1292,7 @@ public class GFEDao extends DefaultPluginDao {
DatabaseQuery query = new DatabaseQuery(this.daoClass);
query.addQueryParam("parmId.dbId.siteId", dbId.getSiteId(),
QueryOperand.EQUALS);
query.addQueryParam("parmId.dbId.format", dbId.getFormat(),
query.addQueryParam("parmId.dbId.dbType", dbId.getDbType(),
QueryOperand.EQUALS);
query.addQueryParam("parmId.dbId.modelName", dbId.getModelName(),
QueryOperand.EQUALS);

View file

@ -53,6 +53,9 @@
class="com.raytheon.edex.plugin.grib.spatial.GribSpatialCache"
factory-method="getInstance" depends-on="gridcoveragelookup"/>
<bean id="ncgribFilenameProcessor" class="com.raytheon.edex.plugin.grib.filenameprocessor.NcgribFileNameProcessor" />
<camelContext id="grib-decode" xmlns="http://camel.apache.org/schema/spring"
errorHandlerRef="errorHandler"
autoStartup="false">
@ -63,6 +66,7 @@
<route id="gribFileConsumerRoute">
<from ref="gribFileEndpoint" />
<bean ref="fileToString" />
<bean ref="ncgribFilenameProcessor" />
<setHeader headerName="pluginName">
<constant>grid</constant>
</setHeader>

View file

@ -54,11 +54,11 @@ public class NcgribFileNameProcessor implements Processor {
// grab global wind and wave ensemble IDs
private static final Pattern ENSEMBLE_WAVE_PATTERN = Pattern
.compile("^gep(\\d{0,2}{2})$");
.compile("^\\d{8}_gep(\\d{0,2}{2})$");
// grab global wind and wave ensemble IDs
private static final Pattern ENSEMBLE_NFC_PATTERN = Pattern
.compile("^HTSGW_(\\d{0,2}{2})$");
.compile("^\\d{8}_HTSGW_(\\d{2})$");
// anything that ends in nest is assumed to be a nested grid identifier
// might add alaska fire weather later...
private static final Pattern FIREWXNEST_ID_PATTERN = Pattern
@ -73,7 +73,7 @@ public class NcgribFileNameProcessor implements Processor {
// This is the least generic pattern ever, are there any constraints on
// event names, who knows?
private static final Pattern HURRICANE_PATTERN = Pattern
.compile("^([a-z]*)\\d{1,2}[lewcs]$");
.compile("^\\d{10}_([a-z]*)\\d{1,2}[lewcs]$");
private static NcgribModelNameMap modelMap = null;
@ -85,6 +85,7 @@ public class NcgribFileNameProcessor implements Processor {
String secondaryid = null;
String ensembleid = null;
String[] nameTokens = flName.split("\\.");
for (String token : nameTokens) {
if (ENSEMBLE_ID_PATTERN.matcher(token).find()) {
ensembleid = token;
@ -112,15 +113,17 @@ public class NcgribFileNameProcessor implements Processor {
matcher.find();
secondaryid = matcher.group(1);
datasetid = "GHM";
if (nameTokens[2].equalsIgnoreCase("gribn3")) {
if (nameTokens[3].equalsIgnoreCase("gribn3")) {
datasetid = "GHMNEST";
} else if (nameTokens[2].equalsIgnoreCase("grib6th")) {
} else if (nameTokens[3].equalsIgnoreCase("grib6th")) {
datasetid = "GHM6TH";
} else if (nameTokens[2].equalsIgnoreCase("hwrfprs_n")) {
} else if (nameTokens[3].equalsIgnoreCase("hwrfprs_n")) {
datasetid = "HWRFNEST";
} else if (nameTokens[2].equalsIgnoreCase("hwrfprs_p")) {
} else if (nameTokens[3].equalsIgnoreCase("hwrfprs_p")) {
datasetid = "HWRF";
}
}
}
@ -128,6 +131,7 @@ public class NcgribFileNameProcessor implements Processor {
modelMap = NcgribModelNameMap.load();
}
// Get model name from grib file template
if (datasetid == null) {
datasetid = modelMap.getModelName(flName);
}

View file

@ -3,219 +3,219 @@
<ncgribModelNameMap>
<mapping>
<entry>
<key>cmc_geavg.*</key>
<key>gens_cmce.*_cmc_geavg.*</key>
<value>cmceDerv</value>
</entry>
<entry>
<key>cmc_gespr.*</key>
<key>gens_cmce.*_cmc_gespr.*</key>
<value>cmceDerv</value>
</entry>
<entry>
<key>gec00.*anl</key>
<key>gens_gefs.*_gec00.*anl</key>
<value>gefsAnal</value>
</entry>
<entry>
<key>gep[0-9][0-9].*anl</key>
<key>gens_gefs.*_gep[0-9][0-9].*anl</key>
<value>gefsAnal</value>
</entry>
<entry>
<key>gec00.*bcf.*</key>
<key>gens_gefs.*_gec00.*bcf.*</key>
<value>gefsBC</value>
</entry>
<entry>
<key>gep[0-9][0-9].*bcf.*</key>
<key>gens_gefs.*_gep[0-9][0-9].*bcf.*</key>
<value>gefsBC</value>
</entry>
<entry>
<key>geavg.*bcf.*</key>
<key>gens_gefs.*_geavg.*bcf.*</key>
<value>gefsBCDerv</value>
</entry>
<entry>
<key>gespr.*bcf.*</key>
<key>gens_gefs.*_gespr.*bcf.*</key>
<value>gefsBCDerv</value>
</entry>
<entry>
<key>geavg.*</key>
<key>gens_gefs.*_geavg.*</key>
<value>gefsDerv</value>
</entry>
<entry>
<key>gespr.*</key>
<key>gens_gefs.*_gespr.*</key>
<value>gefsDerv</value>
</entry>
<entry>
<key>HTSGW_mean.*</key>
<key>wave_nfcens.*_HTSGW_mean.*</key>
<value>nfcMean</value>
</entry>
<entry>
<key>HTSGW_probab.*</key>
<key>wave_nfcens.*_HTSGW_probab.*</key>
<value>nfcProb</value>
</entry>
<entry>
<key>HTSGW_spread.*</key>
<key>wave_nfcens.*_HTSGW_spread.*</key>
<value>nfcSprd</value>
</entry>
<entry>
<key>mens.glo_60m.*.grib2</key>
<key>wave_wave.*_mens.glo_60m.*.grib2</key>
<value>gwwEns</value>
</entry>
<entry>
<key>gep[0-9][0-9].glo_60m.*.grib2</key>
<key>wave_wave.*_gep[0-9][0-9].glo_60m.*.grib2</key>
<value>gwwEns</value>
</entry>
<entry>
<key>mean.*</key>
<key>wave_wave.*_mean.*</key>
<value>gwwMean</value>
</entry>
<entry>
<key>spread.*.grib2</key>
<key>wave_wave.*_spread.*.grib2</key>
<value>gwwSprd</value>
</entry>
<entry>
<key>probab.*.grib2</key>
<key>wave_wave.*_probab.*.grib2</key>
<value>gwwProb</value>
</entry>
<entry>
<key>naefs_geavg.*bcf.*</key>
<key>gens_naefs.*_naefs_geavg.*bcf.*</key>
<value>naefsDervBC</value>
</entry>
<entry>
<key>naefs_gespr.*bcf.*</key>
<key>gens_naefs.*_naefs_gespr.*bcf.*</key>
<value>naefsDervBC</value>
</entry>
<entry>
<key>naefs_gemode.*bcf.*</key>
<key>gens_naefs.*_naefs_gemode.*bcf.*</key>
<value>naefsModeBC</value>
</entry>
<entry>
<key>naefs_ge10pt.*bcf.*</key>
<key>gens_naefs.*_naefs_ge10pt.*bcf.*</key>
<value>naefs10ptBC</value>
</entry>
<entry>
<key>naefs_ge50pt.*bcf.*</key>
<key>gens_naefs.*_naefs_ge50pt.*bcf.*</key>
<value>naefs50ptBC</value>
</entry>
<entry>
<key>naefs_ge90pt.*bcf.*</key>
<key>gens_naefs.*_naefs_ge90pt.*bcf.*</key>
<value>naefs90ptBC</value>
</entry>
<entry>
<key>naefs_geavg.*ndgd_conusf.*grib2</key>
<key>gens_naefs.*_naefs_geavg.*ndgd_conusf.*grib2</key>
<value>naefsDervUS</value>
</entry>
<entry>
<key>naefs_gespr.*ndgd_conusf.*grib2</key>
<key>gens_naefs.*_naefs_gespr.*ndgd_conusf.*grib2</key>
<value>naefsDervUS</value>
</entry>
<entry>
<key>naefs_gemode.*ndgd_conusf.*grib2</key>
<key>gens_naefs.*_naefs_gemode.*ndgd_conusf.*grib2</key>
<value>naefsModeUS</value>
</entry>
<entry>
<key>naefs_ge10pt.*ndgd_conusf.*grib2</key>
<key>gens_naefs.*_naefs_ge10pt.*ndgd_conusf.*grib2</key>
<value>naefs10ptUS</value>
</entry>
<entry>
<key>naefs_ge50pt.*ndgd_conusf.*grib2</key>
<key>gens_naefs.*_naefs_ge50pt.*ndgd_conusf.*grib2</key>
<value>naefs50ptUS</value>
</entry>
<entry>
<key>naefs_ge90pt.*ndgd_conusf.*grib2</key>
<key>gens_naefs.*_naefs_ge90pt.*ndgd_conusf.*grib2</key>
<value>naefs90ptUS</value>
</entry>
<entry>
<key>naefs_geavg.*ndgd_alaskaf.*grib2</key>
<key>gens_naefs.*_naefs_geavg.*ndgd_alaskaf.*grib2</key>
<value>naefsDervAK</value>
</entry>
<entry>
<key>naefs_gespr.*ndgd_alaskaf.*grib2</key>
<key>gens_naefs.*_naefs_gespr.*ndgd_alaskaf.*grib2</key>
<value>naefsDervAK</value>
</entry>
<entry>
<key>naefs_gemode.*ndgd_alaskaf.*grib2</key>
<key>gens_naefs.*_naefs_gemode.*ndgd_alaskaf.*grib2</key>
<value>naefsModeAK</value>
</entry>
<entry>
<key>naefs_ge10pt.*ndgd_alaskaf.*grib2</key>
<key>gens_naefs.*_naefs_ge10pt.*ndgd_alaskaf.*grib2</key>
<value>naefs10ptAK</value>
</entry>
<entry>
<key>naefs_ge50pt.*ndgd_alaskaf.*grib2</key>
<key>gens_naefs.*_naefs_ge50pt.*ndgd_alaskaf.*grib2</key>
<value>naefs50ptAK</value>
</entry>
<entry>
<key>naefs_ge90pt.*ndgd_alaskaf.*grib2</key>
<key>gens_naefs.*_naefs_ge90pt.*ndgd_alaskaf.*grib2</key>
<value>naefs90ptAK</value>
</entry>
<entry>
<key>sref_em.*132.ctl.*</key>
<key>sref_sref.*_sref_em.*132.ctl.*</key>
<value>sref16EM</value>
</entry>
<entry>
<key>sref_em.*132.[pn][1-3].*</key>
<key>sref_sref.*_sref_em.*132.[pn][1-3].*</key>
<value>sref16EM</value>
</entry>
<entry>
<key>sref_nmb.*132.ctl.*</key>
<key>sref_sref.*_sref_nmb.*132.ctl.*</key>
<value>sref16NMB</value>
</entry>
<entry>
<key>sref_nmb.*132.[pn][1-3].*</key>
<key>sref_sref.*_sref_nmb.*132.[pn][1-3].*</key>
<value>sref16NMB</value>
</entry>
<entry>
<key>sref_nmm.*132.ctl.*</key>
<key>sref_sref.*_sref_nmm.*132.ctl.*</key>
<value>sref16NMM</value>
</entry>
<entry>
<key>sref_nmm.*132.[pn][1-3].*</key>
<key>sref_sref.*_sref_nmm.*132.[pn][1-3].*</key>
<value>sref16NMM</value>
</entry>
<entry>
<key>sref.*132.mean.*</key>
<key>sref_sref.*_sref.*132.mean.*</key>
<value>sref16Derv</value>
</entry>
<entry>
<key>sref.*132.prob.*</key>
<key>sref_sref.*_sref.*132.prob.*</key>
<value>sref16Derv</value>
</entry>
<entry>
<key>sref.*132.spread.*</key>
<key>sref_sref.*_sref.*132.spread.*</key>
<value>sref16Derv</value>
</entry>
<entry>
<key>sref_em.*212.ctl.*</key>
<key>sref_sref.*_sref_em.*212.ctl.*</key>
<value>sref40EM</value>
</entry>
<entry>
<key>sref_em.*212.[pn][1-3].*</key>
<key>sref_sref.*_sref_em.*212.[pn][1-3].*</key>
<value>sref40EM</value>
</entry>
<entry>
<key>sref_nmb.*212.ctl.*</key>
<key>sref_sref.*_sref_nmb.*212.ctl.*</key>
<value>sref40NMB</value>
</entry>
<entry>
<key>sref_nmb.*212.[pn][1-3].*</key>
<key>sref_sref.*_sref_nmb.*212.[pn][1-3].*</key>
<value>sref40NMB</value>
</entry>
<entry>
<key>sref_nmm.*212.ctl.*</key>
<key>sref_sref.*_sref_nmm.*212.ctl.*</key>
<value>sref40NMM</value>
</entry>
<entry>
<key>sref_nmm.*212.[pn][1-3].*</key>
<key>sref_sref.*_sref_nmm.*212.[pn][1-3].*</key>
<value>sref40NMM</value>
</entry>
<entry>
<key>sref.*212.mean.*</key>
<key>sref_sref.*_sref.*212.mean.*</key>
<value>sref40Derv</value>
</entry>
<entry>
<key>sref.*212.prob.*</key>
<key>sref_sref.*_sref.*212.prob.*</key>
<value>sref40Derv</value>
</entry>
<entry>
<key>sref.*212.spread.*</key>
<key>sref_sref.*_sref.*212.spread.*</key>
<value>sref40Derv</value>
</entry>
</mapping>

View file

@ -19,11 +19,15 @@
**/
package com.raytheon.edex.plugin.radar;
import java.io.ByteArrayInputStream;
import java.nio.ByteBuffer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
import org.itadaki.bzip2.BZip2InputStream;
import com.raytheon.edex.esb.Headers;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
@ -42,6 +46,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
* Jul 16, 2012 DR 14723 D.Friedman Decompress files atomically
* Mar 20, 2013 1804 bsteffen Switch all radar decompressing to be in
* memory.
* Aug 20, 2013 16157 wkwock Add bunzip2 cabability.
*
* </pre>
*
@ -104,13 +109,27 @@ public class RadarDecompressor {
wmoHeaderSize, radarData.length);
radarData = radarDataWithHeader;
}
} else if (!keepHeader && wmoHeaderSize > 0) {
// strip the header.
radarData = new byte[messageData.length - wmoHeaderSize];
System.arraycopy(messageData, wmoHeaderSize, radarData, 0,
radarData.length);
} else {
radarData = messageData;
radarData = decompressBzip2 (messageData, wmoHeaderSize, headers);
if (radarData !=null) {
if (keepHeader) {
// put the header back on.
byte[] radarDataWithHeader = new byte[radarData.length
+ wmoHeaderSize];
System.arraycopy(messageData, 0, radarDataWithHeader, 0,
wmoHeaderSize);
System.arraycopy(radarData, 0, radarDataWithHeader,
wmoHeaderSize, radarData.length);
radarData = radarDataWithHeader;
}
} else if (!keepHeader && wmoHeaderSize > 0) {
// strip the header.
radarData = new byte[messageData.length - wmoHeaderSize];
System.arraycopy(messageData, wmoHeaderSize, radarData, 0,
radarData.length);
} else {
radarData = messageData;
}
}
} catch (Exception e) {
theHandler.handle(Priority.ERROR, "Failed decompression on "
@ -152,6 +171,33 @@ public class RadarDecompressor {
return false;
}
/**
* Checks to see if inBuf has bzip2 compressed block.
* 0-inOff in inBuf is WMO header.
* (inOff+1) - (inOff+120) is nexrad_header(18 bytes) +
* s_product_description_block (102 bytes)
* And inBuf[inOff+121 to inOff+123] is 'BZh' then it most likely is bzip2
* compressed.
* Also see AWIPS I RadarDecompress.c for more info.
*
* @param inBuf
* the data buffer
* @param inOff
* the offset into the buffer
* @return true if data is bzip2 compressed
*/
private boolean isBzip2Compressed(byte[] inBuf, int inOff) {
if ((inBuf==null) || (inOff < 0) || ((inOff +120) >= inBuf.length)) {
return false;
}
if (inBuf[inOff+120]== 'B' && inBuf[inOff+121]== 'Z' && inBuf[inOff+122]== 'h') {
return true;
}
return false;
}
private int findStartRadarData(String headerInfo) {
int startOfRadarData = 0;
Matcher matcher = WMO_PATTERN.matcher(headerInfo);
@ -222,4 +268,40 @@ public class RadarDecompressor {
return outBuf;
}
/**
* Method to handle bzip2 compressed radar data. If data is not compressed it is
* just copied to the output buffer.
*
* @return The decompressed byte array for the radar data
* or null if not decompressed
*/
private byte[] decompressBzip2(byte[] inBuf, int offset, Headers headers) {
byte[] outBuf = null;
if (isBzip2Compressed(inBuf, offset)) {
byte[] tmpBuf= new byte[inBuf.length-offset-120];
System.arraycopy(inBuf, offset+120, tmpBuf, 0, tmpBuf.length);
ByteArrayInputStream is = new ByteArrayInputStream(tmpBuf);
BZip2InputStream bis= new BZip2InputStream(is,false);
try {
//use 10x85716 should be safe
byte[] tmpBuf2= new byte[860000];
int actualByte=bis.read(tmpBuf2);
bis.close();
outBuf = new byte[actualByte+120];
//the 120 bytes:description block and symbology block
System.arraycopy(inBuf, offset, outBuf, 0, 8);
byte[] lengthMsg2=ByteBuffer.allocate(4).putInt(outBuf.length).array();
System.arraycopy(lengthMsg2, 0, outBuf, 8, 4);
System.arraycopy(inBuf, offset+8+4, outBuf, 12, 108);
System.arraycopy(tmpBuf2, 0, outBuf, 120, actualByte);
} catch (Exception e) {
theHandler.handle(Priority.ERROR,
"Failed to decompress " + headers.get("ingestfilename"));
}
}
return outBuf;
}
}

View file

@ -46,6 +46,7 @@ import com.raytheon.uf.edex.decodertools.core.ReportParser;
* ------------ ---------- ----------- --------------------------
* 20071010 391 jkorman Initial coding.
* 20071109 391 jkorman Added guard for short data.
* 2013/8 757 T. Lee Checked missing wave height from ship report
*
* </pre>
*
@ -254,7 +255,7 @@ public class SynopticSec2Decoder extends AbstractSectionDecoder {
wavePeriod = null;
}
}
if(waveHeight != null) {
if((waveHeight != null) && (waveHeight >=0) ) {
receiver.setWaveHeight(waveHeight.doubleValue() * 0.5);
}
if(windWavePeriod != null) {
@ -265,7 +266,7 @@ public class SynopticSec2Decoder extends AbstractSectionDecoder {
windWavePeriod = null;
}
}
if(windWaveHeight != null) {
if((windWaveHeight != null) && (windWaveHeight >=0) ) {
receiver.setWindWaveHeight(windWaveHeight.doubleValue() * 0.5);
}
if ((wavePeriod != null) && (waveHeight != null)) {

View file

@ -34,6 +34,7 @@
# Feb 19, 2013 1636 rferrel Use TimeTools to get file timestamp.
# May 07, 2013 1973 rferrel Adjust Issue and Purge times to be relative to start time.
# Jun 24, 2013 DR 16317 D. Friedman If no storm line, parse storm motion from event text.
# Aug 21, 2013 DR16501 m.gamazaychikov Adjusted calculation of Purge time in NoVTECWarningDecoder.
# </pre>
#
# @author rferrel
@ -986,7 +987,7 @@ class NoVTECWarningDecoder(StdWarningDecoder):
if self._officeFromWMO:
template['officeid'] = self._officeFromWMO
template['purgeTime'] = long(purgeTime * 1000)
template['purgeTime'] = long(self._dtgFromDDHHMM(purgeTime, self._issueTime)*1000)
template['issueTime'] = long(self._issueTime * 1000)
template['state'] = "Decoded"
template['xxxid'] = self._completeProductPil[3:]

View file

@ -688,7 +688,6 @@ public class FFMPBasinData implements ISerializableObject {
* @param times
*/
public void populate(List<Long> times) {
if (mapFactory == null) {
mapFactory = new BasinMapFactory<Date>(Collections.reverseOrder(),
getBasins().size());

View file

@ -66,6 +66,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* 02/19/13 #1637 randerso Fixed remapping of byte grids
* 07/09/13 #2044 randerso Made SoftReferences to interp and rotation since
* they can be quite large and may not be needed frequently
* 08/27/13 #2287 randerso Removed 180 degree adjustment required by error
* in Maputil.rotation
* 07/17/13 #2185 bsteffen Cache computed grid reprojections.
* 08/13/13 #1571 randerso Passed fill values into interpolator.
*
@ -642,8 +644,8 @@ public class RemapGrid {
for (int y1 = 0; y1 < rotation.getYdim(); y1++) {
Coordinate llc = destinationGloc
.latLonCenter(new Coordinate(x1, y1));
rotation.set(x1, y1, (float) (180 - MapUtil.rotation(
llc, sourceGloc)));
rotation.set(x1, y1,
(float) (-MapUtil.rotation(llc, sourceGloc)));
}
}
rotationRef = new SoftReference<Grid2DFloat>(rotation);

View file

@ -94,6 +94,8 @@ import com.vividsolutions.jts.geom.Polygon;
* 06/19/2012 14988 D. Friedman Make oversampling more like AWIPS 1
* 09/18/2012 #1091 randerso corrected getBoundingEnvelope
* 11/06/2012 15406 ryu Added convertToNativeEnvelope()
* 08/27/2013 #2287 randerso Fixed rotation methods so it is not necessary
* to subtract 180 from the returned value
*
* </pre>
*
@ -1062,12 +1064,13 @@ public class MapUtil {
* the right of UP is north (or 360) degrees.
*
* @param latLon
* @param spatialObject
* @return rotation angle
*/
public static double rotation(Coordinate latLon,
ISpatialObject spatialObject) {
double newLatLonY = latLon.y + 0.05;
double newLatLonY = latLon.y - 0.05;
if (newLatLonY > 90) {
newLatLonY -= 180;
}
@ -1098,11 +1101,12 @@ public class MapUtil {
* the right of UP is north (or 360) degrees.
*
* @param latLon
* @param geometry
* @return rotation angle
*/
public static double rotation(Coordinate latLon, GridGeometry2D geometry) {
double newLatLonY = latLon.y + 0.05;
double newLatLonY = latLon.y - 0.05;
if (newLatLonY > 90) {
newLatLonY -= 180;
}

View file

@ -20,6 +20,7 @@
package com.raytheon.uf.common.geospatial;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.referencing.CRS;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.geotools.referencing.operation.transform.IdentityTransform;
import org.opengis.referencing.FactoryException;
@ -166,6 +167,27 @@ public class TransformFactory {
return factory.createConcatenatedTransform(mt1, mt2);
}
/**
* Constructs a transform from the "world" CRS of the crs passed in. null
* will be returned if no "world" crs exists.
*
* @param crs
* @return
* @throws FactoryException
*/
public static MathTransform worldToCRS(CoordinateReferenceSystem crs)
throws FactoryException {
CoordinateReferenceSystem worldCRS = crs;
while (worldCRS instanceof GeneralDerivedCRS) {
GeneralDerivedCRS derivedCRS = (GeneralDerivedCRS) worldCRS;
worldCRS = derivedCRS.getBaseCRS();
}
if (worldCRS != crs) {
return CRS.findMathTransform(worldCRS, crs);
}
return null;
}
/**
* Constructs a transform from the "world" CRS of the target geometry to the
* grid of the targetGeometry. Will return crsToGrid if no "world" CRS
@ -178,23 +200,19 @@ public class TransformFactory {
*/
public static MathTransform worldToGrid(GeneralGridGeometry targetGeometry,
PixelInCell cellType) throws FactoryException {
CoordinateReferenceSystem crs = targetGeometry.getEnvelope()
.getCoordinateReferenceSystem();
try {
if (crs instanceof GeneralDerivedCRS) {
GeneralDerivedCRS projCRS = (GeneralDerivedCRS) crs;
CoordinateReferenceSystem worldCRS = projCRS.getBaseCRS();
MathTransform worldToCRS = CRSCache.getInstance()
.findMathTransform(worldCRS, crs);
MathTransform crsToPixel = targetGeometry
.getGridToCRS(cellType).inverse();
return factory.createConcatenatedTransform(worldToCRS,
crsToPixel);
} else {
// No associated "world" CRS, go straight crs to grid
return targetGeometry.getGridToCRS(cellType).inverse();
CoordinateReferenceSystem crs = targetGeometry.getEnvelope()
.getCoordinateReferenceSystem();
MathTransform worldToCRS = worldToCRS(crs);
MathTransform worldToGrid = targetGeometry.getGridToCRS(cellType)
.inverse();
if (worldToCRS != null) {
worldToGrid = factory.createConcatenatedTransform(worldToCRS,
worldToGrid);
}
return worldToGrid;
} catch (FactoryException e) {
throw e;
} catch (Exception e) {
throw new FactoryException(e);
}

View file

@ -61,6 +61,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
* Feb 27, 2013 1638 mschenke Cleaned up localization code to fix null pointer
* when no distribution files present
* Mar 19, 2013 1794 djohnson PatternWrapper is immutable, add toString() to it for debugging.
* Aug 19, 2013 2257 bkowal edexBridge to qpid 0.18 upgrade
*
* </pre>
*
@ -73,6 +74,8 @@ public class DistributionSrv {
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(DistributionSrv.class);
private static final String HEADER_QPID_SUBJECT = "qpid.subject";
private static class PatternWrapper {
private final String plugin;
@ -223,7 +226,15 @@ public class DistributionSrv {
StringBuilder pluginNames = new StringBuilder();
List<String> dest = new ArrayList<String>();
Message in = exchange.getIn();
String header = (String) in.getHeader("header");
// determine if the header is in the qpid subject field?
String header = (String) in.getHeader(HEADER_QPID_SUBJECT);
if (header != null) {
// make the qpid subject the header so that everything downstream
// will be able to read it as the header.
in.setHeader("header", header);
}
header = (String) in.getHeader("header");
Object payload = in.getBody();
String bodyString = null;
if (payload instanceof byte[]) {
@ -277,8 +288,8 @@ public class DistributionSrv {
throws DistributionException {
RequestPatterns patternSet = null;
try {
patternSet = SerializationUtil
.jaxbUnmarshalFromXmlFile(RequestPatterns.class, modelFile.getPath());
patternSet = SerializationUtil.jaxbUnmarshalFromXmlFile(
RequestPatterns.class, modelFile.getPath());
} catch (Exception e) {
throw new DistributionException("File "
+ modelFile.getAbsolutePath()

View file

@ -39,6 +39,7 @@ import com.raytheon.uf.edex.database.cluster.ClusterTask;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 19, 2010 njensen Initial creation
* Aug 21, 2013 DR 16521 D. Friedman Ensure endpoint URI is used for cluster entry
*
* </pre>
*
@ -61,7 +62,7 @@ public class ClusteredQuartzEndpoint extends QuartzEndpoint {
@Override
public void onJobExecute(final JobExecutionContext jobExecutionContext)
throws JobExecutionException {
String jName = jobExecutionContext.getJobDetail().getName();
String jName = getEndpointUri();
long period = Math.abs(jobExecutionContext.getFireTime().getTime()
- jobExecutionContext.getNextFireTime().getTime()) / 2;
ClusterTask ct = ClusterLockUtils.lock(TASK, jName, period, false);

View file

@ -0,0 +1,34 @@
#!/bin/bash
##
##
##############################################################################
# This script allows users to query point data database from EDEX.
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 05/20/2013 Chin Chen Initial Creation.
##############################################################################
# this allows you to run this script from outside of ./bin
path_to_script=`readlink -f $0`
RUN_FROM_DIR=`dirname $path_to_script`
BASE_AWIPS_DIR=`dirname $RUN_FROM_DIR`
# get the base environment
source ${RUN_FROM_DIR}/setup.env
# setup the environment needed to run the the Python
export LD_LIBRARY_PATH=${BASE_AWIPS_DIR}/src/lib:${PYTHON_INSTALL}/lib
export PYTHONPATH=${RUN_FROM_DIR}/src:$PYTHONPATH
# execute the ifpInit Python module
_PYTHON="${PYTHON_INSTALL}/bin/python"
_MODULE="${RUN_FROM_DIR}/src/gpd/gpd.py"
# quoting of '$@' is used to prevent command line interpretation
#$_PYTHON $_MODULE -h ${DEFAULT_HOST} -p ${DEFAULT_PORT} "$@"
$_PYTHON $_MODULE "$@"

View file

@ -0,0 +1,117 @@
##
# This script is used to send GPD request to EDEX.
#
# Users can override the default EDEX server and port name by specifying them
# in the $DEFAULT_HOST and $DEFAULT_PORT shell environment variables.
#
# 5/22/2013 Chin J. Chen
##
import os
from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gpd.query import GenericPointDataReqMsg
from ufpy import ThriftClient
class GpdCliRequestHandler:
""" Request Activity to EDEX."""
def __init__(self):
self.host = os.getenv("DEFAULT_HOST", "localhost")
self.port = os.getenv("DEFAULT_PORT", "9581")
self.client = ThriftClient.ThriftClient(self.host, self.port)
def getGpdProdInfo(self, prodName, reqType):
req = GenericPointDataReqMsg()
req.setReqType(reqType)
req.setProductName(prodName)
resp = self.client.sendRequest(req)
return resp
def getGpdProduct(self, refTime,prodName , reqType,querySpecifiedProductVersion=None,versionNum=None ):
req = GenericPointDataReqMsg()
req.setReqType(reqType)
req.setRefTime(refTime)
req.setProductName(prodName)
if (querySpecifiedProductVersion!= None and versionNum !=None):
req.setQuerySpecifiedProductVersion(querySpecifiedProductVersion)
req.setProductVersion(versionNum)
resp = self.client.sendRequest(req)
return resp
def getGpdStationProduct(self, stnId, refTime,prodName , reqType,querySpecifiedProductVersion=None,versionNum=None ):
req = GenericPointDataReqMsg()
req.setReqType(reqType)
req.setStnId(stnId)
req.setRefTime(refTime)
req.setProductName(prodName)
if (querySpecifiedProductVersion!= None and versionNum !=None):
req.setQuerySpecifiedProductVersion(querySpecifiedProductVersion)
req.setProductVersion(versionNum)
resp = self.client.sendRequest(req)
return resp
def getGpdMovingProduct(self, slat, slon, refTime,prodName , reqType,querySpecifiedProductVersion=None,versionNum=None ):
req = GenericPointDataReqMsg()
req.setReqType(reqType)
req.setSlon(slon)
req.setSlat(slat)
req.setRefTime(refTime)
req.setProductName(prodName)
if (querySpecifiedProductVersion!= None and versionNum !=None):
req.setQuerySpecifiedProductVersion(querySpecifiedProductVersion)
req.setProductVersion(versionNum)
resp = self.client.sendRequest(req)
return resp
def storeGpdGempakProduct(self, gpdGempak, prodName, maxNumLevel,versionNum):
req = GenericPointDataReqMsg()
req.setReqType("STORE_GPD_PRODUCT_FROM_GEMPAK_TBL")
req.setGpdDataString(gpdGempak)
req.setProductName(prodName)
req.setProductVersion(versionNum)
req.setMaxNumLevel(maxNumLevel)
resp = self.client.sendRequest(req)
return resp
def storeGpdXmlProduct(self, gpdXml):
req = GenericPointDataReqMsg()
req.setReqType("STORE_GPD_PRODUCT_FROM_XML")
req.setGpdDataString(gpdXml)
resp = self.client.sendRequest(req)
return resp
def storeGpdProductInfo(self, gpdXml):
req = GenericPointDataReqMsg()
req.setReqType("STORE_GPD_PRODUCT_INFO_FROM_XML")
req.setGpdDataString(gpdXml)
resp = self.client.sendRequest(req)
return resp
'''
def purgeGpdProd(self, prodName, refTime=None, all=None):
req = GenericPointDataReqMsg()
if(all == "yes"):
req.setReqType("PURGE_GPD_PRODUCT_ALLTIME")
else:
req.setReqType("PURGE_GPD_PRODUCT_ONETIME")
if(refTime!=None):
req.setRefTime(refTime)
else:
return "reference time required for purging"
req.setProductName(prodName)
resp = self.client.sendRequest(req)
return resp
'''
def purgeGpdExpired(self):
req = GenericPointDataReqMsg()
req.setReqType("PURGE_GPD_EXPIRED_PRODUCT")
resp = self.client.sendRequest(req)
return resp
def purgeGpdAll(self):
req = GenericPointDataReqMsg()
req.setReqType("PURGE_GPD_ALL_PRODUCTS")
resp = self.client.sendRequest(req)
return resp

View file

@ -0,0 +1,695 @@
##
# This script is used to query Generic Point Data database from EDEX.
#
# 5/22/2013 Chin J. Chen
##
import io
import logging
import sys
import time
import GpdCliRequestHandler
from ufpy import UsageArgumentParser
from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gpd.query import GenericPointDataReqMsg
from dynamicserialize.dstypes.java.util import Date
logger = None
parser = None
USAGE_MESSAGE = \
"""
<To query product information in XML format, result saved at optional filePath >
gpd qix --p prodName --f filePath
<To query and list product information in XML format >
gpd qixl --p prodName
<To query a product (all stations) in XML format, optional version number, result saved at optional filePath >
gpd qpx --p prodName --t referenceTime [--f filePath --v versionNum]
<To query and list a product (all stations) in XML format, optional version number >
gpd qpxl --p prodName --t referenceTime [--v versionNum]
<To query a station product (single station) in XML format,optional version number, result saved at optional filePath >
gpd qsx --p prodName --t referenceTime --id stationId [--f filePath --v versionNum]
<To query and list a station product (single station) in XML format, optional version number >
gpd qsxl --p prodName --t referenceTime --id stationId [--v versionNum]
<To query a moving product in XML format, optional version number result saved at optional filePath >
gpd qmx --p prodName --t referenceTime --slat latitude --slon longitude [--f filePath --v versionNum]
<To query and list a moving product in XML format,optional version number >
gpd qmxl --p prodName --t referenceTime --slat latitude --slon longitude [--v versionNum]
<To query product information in Gempak format, result saved at filePath >
<To store product XML file at filePath to EDEX server database>
gpd spx --f filePath
<To store product GEMPAK file at filePath to EDEX server database>
gpd spg --f filePath --p prodName [--v versionNum]
<To purge expired products from DB and HDF5>
gpd pe
<To purge all products from DB and HDF5>
gpd pa
<To print this usage>
gpd u
#######
NOTE: referenceTime string format yyyy-mm-dd HH:MM:SS, for example "2013-05-21 20:30:00"
filePath - required when saving Gempak table or XML file
filePath - optional when querying, if not provided, result will be saved at current directory
versionNum - optional, if not provided, latest version is returned
#######
"""
SUBCOMMAND_MESSAGE = \
"""
qix: To query product information, result saved at optional filePath
qixl: To query and list product information
qpx: To query a product (all stations), result saved at optional filePath
qpxl: To query and list a product (all stations)
qsx: To query a station product, result saved at optional filePath
qsxl: To query and list a station product
qmx: To query a moving product, result saved at optional filePath
qmxl: To query and print a moving product
spx: To store product XML file to EDEX server database
spg: To store product GEMPAk table file to EDEX server database
pe: To purge expired products
pa: To purge all products
u: To print usage
"""
'''
gpd qig --p prodName --f filePath
<To query and list product information in Gempak format >
gpd qigl --p prodName
<To query a product (all stations) in Gempak format, optional version number, result saved at filePath >
gpd qpg --p prodName --t referenceTime [--f filePath --v versionNum]
<To query and list a product (all stations) in Gempak format, optional version number >
gpd qpgl --p prodName --t referenceTime [--v versionNum]
<To query a station product (single station) in Gempak format,optional version number, result saved at optional filePath >
gpd qsg --p prodName --t referenceTime --id stationId [--f filePath --v versionNum]
<To query and list a station product (single station) in Gempak format, optional version number >
gpd qsgl --p prodName --t referenceTime --id stationId [--v versionNum]
<To query a moving product in Gempak format, optional version number result saved at optional filePath >
gpd qmg --p prodName --t referenceTime --slat latitude --slon longitude [--f filePath --v versionNum]
<To query and list a moving product in Gempak format, optional version number >
gpd qmgl --p prodName --t referenceTime --slat latitude --slon longitude [--v versionNum]
qig: To query product information, result saved at optional filePath
qigl: To query and list product information
qpg: To query a product (all stations), result saved at optional filePath
qpgl: To query and list a product (all stations)
qsg: To query a station product, result saved at optional filePath
qsgl: To query and list a station product
qmg: To query a moving product, result saved at optional filePath
qmgl: To query and print a moving product
'''
def __initLogger():
global logger
logger = logging.getLogger("gpd")
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
# Uncomment line below to enable debug-level logging
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter("\n%(asctime)s %(name)s %(levelname)s: %(message)s", "%H:%M:%S")
ch.setFormatter(formatter)
logger.addHandler(ch)
def __parseCommandLine():
global parser
parser = UsageArgumentParser.UsageArgumentParser(prog='gpd',description="Query or store point data database from EDEX.")#, usage=USAGE_MESSAGE)
#parser.add_argument("-u", action="help",
# help="show usage")
subparsers = parser.add_subparsers(help=USAGE_MESSAGE)
#to print usage
parser_usage = subparsers.add_parser('u')
parser_usage.set_defaults(func=__printUsage)
#To update/replace product information
#parser_saveinfo = subparsers.add_parser('si')
#parser_saveinfo.add_argument("--f", dest="filePath", action="store",required=True,
# help=":target file path for return product")
#parser_saveinfo.set_defaults(func=__saveProdInfo)
#To save a GPD product in XML format
parser_saveprod_xml = subparsers.add_parser('spx')
parser_saveprod_xml.add_argument("--f", dest="filePath", action="store",required=True,
help=":target file path for return product")
parser_saveprod_xml.set_defaults(func=__saveProdXml)
#To save a GPD product in GEMPAk table format
parser_saveprod_gempak = subparsers.add_parser('spg')
parser_saveprod_gempak.add_argument("--f", dest="filePath", action="store",required=True,
help=":target file path for return product")
parser_saveprod_gempak.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_saveprod_gempak.add_argument("--l", dest="maxNumLevel", action="store",required=True,
help=":max number of level for product")
parser_saveprod_gempak.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_saveprod_gempak.set_defaults(func=__saveProdGempak)
#To query product information
parser_infoXml = subparsers.add_parser('qix')
parser_infoXml.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_infoXml.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_infoXml.set_defaults(func=__getProdInfoXml)
parser_info_printXml = subparsers.add_parser('qixl')
parser_info_printXml.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
#parser_info_printXml.add_argument("--f", dest="filePath", action="store",
# help=":target file path for return product")
parser_info_printXml.set_defaults(func=__getPrintProdInfoXml)
'''
parser_infoGempak = subparsers.add_parser('qig')
parser_infoGempak.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_infoGempak.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_infoGempak.set_defaults(func=__getProdInfoGempak)
parser_info_printGempak = subparsers.add_parser('qigl')
parser_info_printGempak.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_info_printGempak.set_defaults(func=__getPrintProdInfoGempak)
'''
#To query a station product (single station)
parser_stnProdXml = subparsers.add_parser('qsx')
parser_stnProdXml.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_stnProdXml.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_stnProdXml.add_argument("--id", dest="stnId", action="store",required=True,
help=":station id of a product")
parser_stnProdXml.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_stnProdXml.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_stnProdXml.set_defaults(func=__getStnProdXml)
parser_stnProdXml_print = subparsers.add_parser('qsxl')
parser_stnProdXml_print.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_stnProdXml_print.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_stnProdXml_print.add_argument("--id", dest="stnId", action="store",required=True,
help=":station id of a product")
parser_stnProdXml_print.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_stnProdXml_print.set_defaults(func=__getPrintStnProdXml)
'''
parser_stnProdGempak = subparsers.add_parser('qsg')
parser_stnProdGempak.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_stnProdGempak.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_stnProdGempak.add_argument("--id", dest="stnId", action="store",required=True,
help=":station id of a product")
parser_stnProdGempak.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_stnProdGempak.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_stnProdGempak.set_defaults(func=__getStnProdGempak)
parser_stnProdGempak_print = subparsers.add_parser('qsgl')
parser_stnProdGempak_print.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_stnProdGempak_print.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_stnProdGempak_print.add_argument("--id", dest="stnId", action="store",required=True,
help=":station id of a product")
parser_stnProdGempak_print.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_stnProdGempak_print.set_defaults(func=__getPrintStnProdGempak)
'''
#To query a moving product
parser_movingProdXml = subparsers.add_parser('qmx')
parser_movingProdXml.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_movingProdXml.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_movingProdXml.add_argument("--slat", dest="slat", type=float, action="store",required=True,
help=":latitude of a moving product")
parser_movingProdXml.add_argument("--slon", dest="slon", type=float, action="store",required=True,
help=":longitude of a moving product")
parser_movingProdXml.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_movingProdXml.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_movingProdXml.set_defaults(func=__getMovingProdXml)
parser_movingProdXml_print = subparsers.add_parser('qmxl')
parser_movingProdXml_print.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_movingProdXml_print.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_movingProdXml_print.add_argument("--slat", dest="slat", type=float, action="store",required=True,
help=":latitude of a moving product")
parser_movingProdXml_print.add_argument("--slon", dest="slon", type=float, action="store",required=True,
help=":longitude of a moving product")
parser_movingProdXml_print.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_movingProdXml_print.set_defaults(func=__getPrintMovingProdXml)
'''
parser_movingProdGempak = subparsers.add_parser('qmg')
parser_movingProdGempak.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_movingProdGempak.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_movingProdGempak.add_argument("--slat", dest="slat", type=float, action="store",required=True,
help=":latitude of a moving product")
parser_movingProdGempak.add_argument("--slon", dest="slon", type=float, action="store",required=True,
help=":longitude of a moving product")
parser_movingProdGempak.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_movingProdGempak.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_movingProdGempak.set_defaults(func=__getMovingProdGempak)
parser_movingProdGempak_print = subparsers.add_parser('qmgl')
parser_movingProdGempak_print.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_movingProdGempak_print.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_movingProdGempak_print.add_argument("--slat", dest="slat", type=float, action="store",required=True,
help=":latitude of a moving product")
parser_movingProdGempak_print.add_argument("--slon", dest="slon", type=float, action="store",required=True,
help=":longitude of a moving product")
parser_movingProdGempak_print.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_movingProdGempak_print.set_defaults(func=__getPrintMovingProdGempak)
'''
#To query a product
parser_prodXml = subparsers.add_parser('qpx')
parser_prodXml.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_prodXml.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_prodXml.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_prodXml.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_prodXml.set_defaults(func=__getProdXml)
'''
parser_prodGempak = subparsers.add_parser('qpg')
parser_prodGempak.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_prodGempak.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_prodGempak.add_argument("--f", dest="filePath", action="store",
help=":target file path for return product")
parser_prodGempak.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_prodGempak.set_defaults(func=__getProdGempak)
'''
parser_prodXml_print = subparsers.add_parser('qpxl')
parser_prodXml_print.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_prodXml_print.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_prodXml_print.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_prodXml_print.set_defaults(func=__getPrintProdXml)
'''
parser_prodGempak_print = subparsers.add_parser('qpgl')
parser_prodGempak_print.add_argument("--p", dest="prodName", action="store",required=True,
help=":name of a Generic Point Data product")
parser_prodGempak_print.add_argument("--t", dest="refTime", action="store",required=True,
help=":reference time of a product")
parser_prodGempak_print.add_argument("--v", dest="versionNum", action="store",
help=":product version")
parser_prodGempak_print.set_defaults(func=__getPrintProdGempak)
'''
'''
#parser_purge_prod = subparsers.add_parser('pp')
#parser_purge_prod.add_argument("--p", dest="prodName", action="store",required=True,
# help=":name of a Generic Point Data product")
#parser_purge_prod.add_argument("--t", dest="refTime", action="store",
# help=":reference time of a product")
#parser_purge_prod.add_argument("--all", dest="all", action="store",
# help=":yes")
#parser_purge_prod.set_defaults(func=__purgeProd)
'''
parser_purge_expired = subparsers.add_parser('pe')
parser_purge_expired.set_defaults(func=__purgeExpired)
parser_purge_all = subparsers.add_parser('pa')
parser_purge_all.set_defaults(func=__purgeAll)
options = parser.parse_args()
#logger.debug("Command-line arguments: " + str(options))
return options
def __convertTimeToDate(refTime):
struct_time = time.strptime(refTime, "%Y-%m-%d %H:%M:%S")
#print "returned tuple: %s " % struct_time
#print "timeZone " + str(time.timezone) + " altimezone " + str(time.altzone)
milsec = (time.mktime(struct_time)-time.altzone) * 1000
date= Date()
date.setTime(milsec)
#print "time in msec: %s" % str(date.getTime())
return date
def __createFilenameStringXml(name, refTime):
filename = name + '@'+ refTime.replace(" ","@")+".xml"
return filename
def __createFilenameStringGempak(name, refTime):
filename = name + '@'+ refTime.replace(" ","@")+".gempak"
return filename
def __getPrintProdInfoXml(options):
req= GpdCliRequestHandler.GpdCliRequestHandler()
prodInfo = req.getGpdProdInfo(options.prodName, "GET_GPD_PRODUCT_INFO_XML")
if(prodInfo != None):
print(prodInfo)
else:
print("Query failed!")
def __getProdInfoXml(options):
#if options.prodName == None:
# parser.print_help()
# return None
req= GpdCliRequestHandler.GpdCliRequestHandler()
prodInfo = req.getGpdProdInfo(options.prodName,"GET_GPD_PRODUCT_INFO_XML")
if(prodInfo != None):
if(options.filePath == None):
f = open(options.prodName+"Info.xml",'w')
else:
f = open(options.filePath,'w')
f.write(prodInfo)
return prodInfo
else:
print("Query failed!")
return None
def __getPrintProdInfoGempak(options):
req= GpdCliRequestHandler.GpdCliRequestHandler()
prodInfo = req.getGpdProdInfo(options.prodName, "GET_GPD_PRODUCT_INFO_GEMPAK_TBL")
if(prodInfo != None):
print(prodInfo)
else:
print("Query failed!")
def __getProdInfoGempak(options):
#if options.prodName == None:
# parser.print_help()
# return None
req= GpdCliRequestHandler.GpdCliRequestHandler()
prodInfo = req.getGpdProdInfo(options.prodName,"GET_GPD_PRODUCT_INFO_GEMPAK_TBL")
if(prodInfo != None):
if(options.filePath == None):
f = open(options.prodName+"Info.gempak",'w')
else:
f = open(options.filePath,'w')
f.write(prodInfo)
return prodInfo
else:
print("Query failed!")
return None
#===========================================================================
# print ("GPD Report::::::::::::::")
# print str("Report Name: "+ prodInfo.getName())
# print str("Master Level Name = " + prodInfo.getMasterLevel().getName())
# print str("Master Level Description = " + prodInfo.getMasterLevel().getDescription())
# print str("Master Level Type = " + prodInfo.getMasterLevel().getType())
# print str("Master Level Unit String = " + prodInfo.getMasterLevel().getUnitString())
# print ("Max NUmber of Level = " + str(prodInfo.getMaxNumberOfLevel()))
# print ("Parameters:")
# parmLst =prodInfo.getParameterLst()
# i = 1
# for parm in parmLst:
# print ("Parameter "+ str(i)+ ": Abbreviation="+ str(parm.getAbbreviation())+ " Unit="+str(parm.getUnitString())+ " Name =" + str(parm.getName()))
# i=i+1
#===========================================================================
def __getStnProdXml(options):
#if options.prodName == None or options.refTime == None or options.stnId == None:
# parser.print_help()
# return None
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName,"GET_GPD_STATION_PRODUCT_XML")
else:
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName, "GET_GPD_STATION_PRODUCT_XML", True, int(options.versionNum))
if(stnProd!=None):
if(options.filePath == None):
filename = __createFilenameStringXml((options.prodName+'@'+options.stnId),options.refTime)
else:
filename = options.filePath
f = open(filename,'w')
f.write(stnProd)
return stnProd
else:
print("Query failed!")
return None
def __getPrintStnProdXml(options):
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName,"GET_GPD_STATION_PRODUCT_XML")
else:
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName, "GET_GPD_STATION_PRODUCT_XML",True, int(options.versionNum))
if(stnProd != None):
print(stnProd)
else:
print("Query failed!")
def __getStnProdGempak(options):
#if options.prodName == None or options.refTime == None or options.stnId == None:
# parser.print_help()
# return None
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName,"GET_GPD_STATION_PRODUCT_GEMPAK_TBL")
else:
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName, "GET_GPD_STATION_PRODUCT_GEMPAK_TBL", True, int(options.versionNum))
if(stnProd!=None):
if(options.filePath == None):
filename = __createFilenameStringGempak((options.prodName+'@'+options.stnId),options.refTime)
else:
filename = options.filePath
f = open(filename,'w')
f.write(stnProd)
return stnProd
else:
print("Query failed!")
return None
def __getPrintStnProdGempak(options):
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName,"GET_GPD_STATION_PRODUCT_GEMPAK_TBL")
else:
stnProd = req.getGpdStationProduct(options.stnId, date,options.prodName, "GET_GPD_STATION_PRODUCT_GEMPAK_TBL",True, int(options.versionNum))
if(stnProd != None):
print(stnProd)
else:
print("Query failed!")
def __getMovingProdXml(options):
#if options.prodName == None or options.refTime == None or options.slat == None or options.slon == None:
# parser.print_help()
# return None
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName,"GET_GPD_MOVING_PRODUCT_XML")
else:
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName, "GET_GPD_MOVING_PRODUCT_XML",True, int(options.versionNum))
if(stnProd!=None):
if(options.filePath == None):
filename = __createFilenameStringXml((options.prodName+'@'+str(options.slat)+'#'+str(options.slon)),options.refTime)
else:
filename = options.filePath
f = open(filename,'w')
f.write(stnProd)
return stnProd
else:
print("Query failed!")
return None
def __getPrintMovingProdXml(options):
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName,"GET_GPD_MOVING_PRODUCT_XML")
else:
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName, "GET_GPD_MOVING_PRODUCT_XML", True, int(options.versionNum))
if(stnProd != None):
print(stnProd)
else:
print("Query failed!")
def __getMovingProdGempak(options):
#if options.prodName == None or options.refTime == None or options.slat == None or options.slon == None:
# parser.print_help()
# return None
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName,"GET_GPD_MOVING_PRODUCT_GEMPAK_TBL")
else:
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName, "GET_GPD_MOVING_PRODUCT_GEMPAK_TBL",True, int(options.versionNum))
if(stnProd!=None):
if(options.filePath == None):
filename = __createFilenameStringGempak((options.prodName+'@'+str(options.slat)+'#'+str(options.slon)),options.refTime)
else:
filename = options.filePath
f = open(filename,'w')
f.write(stnProd)
return stnProd
else:
print("Query failed!")
return None
def __getPrintMovingProdGempak(options):
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName,"GET_GPD_MOVING_PRODUCT_GEMPAK_TBL")
else:
stnProd = req.getGpdMovingProduct(options.slat, options.slon, date,options.prodName, "GET_GPD_MOVING_PRODUCT_GEMPAK_TBL", True, int(options.versionNum))
if(stnProd != None):
print(stnProd)
else:
print("Query failed!")
def __getProdXml(options):
#if options.prodName == None or options.refTime == None:
# parser.print_help()
# return None
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_XML")
else:
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_XML", True, int(options.versionNum))
if(prod != None):
if(options.filePath == None):
filename = __createFilenameStringXml(options.prodName,options.refTime)
else:
filename = options.filePath
f = open(filename,'w')
f.write(prod)
return prod
else:
print("Query failed!")
return None
def __getPrintProdXml(options):
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_XML")
else:
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_XML", True, int(options.versionNum))
if(prod != None):
print(prod)
else:
print("Query failed!")
def __getProdGempak(options):
#if options.prodName == None or options.refTime == None:
# parser.print_help()
# return None
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_GEMPAK_TBL")
else:
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_GEMPAK_TBL", True, int(options.versionNum))
if(prod != None):
if(options.filePath == None):
filename = __createFilenameStringGempak(options.prodName,options.refTime)
else:
filename = options.filePath
f = open(filename,'w')
f.write(prod)
return prod
else:
print("Query failed!")
return None
def __getPrintProdGempak(options):
date = __convertTimeToDate(options.refTime)
req= GpdCliRequestHandler.GpdCliRequestHandler()
if(options.versionNum == None):
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_GEMPAK_TBL")
else:
prod = req.getGpdProduct( date,options.prodName,"GET_GPD_PRODUCT_GEMPAK_TBL", True, int(options.versionNum))
if(prod != None):
print(prod)
else:
print("Query failed!")
#def __purgeProd(options):
# req= GpdCliRequestHandler.GpdCliRequestHandler()
# req.purgeGpdProd(options.prodName,options.refTime, option.all)
def __purgeExpired(options):
req= GpdCliRequestHandler.GpdCliRequestHandler()
req.purgeGpdExpired()
def __purgeAll(options):
req= GpdCliRequestHandler.GpdCliRequestHandler()
req.purgeGpdAll()
def __printUsage(options):
print(USAGE_MESSAGE)
def __saveProdXml(options):
# read in XML from input file
xmlfile = io.open(options.filePath, 'rb')
gpdXML = xmlfile.read()
xmlfile.close()
# Store GPD report to EDEX
req= GpdCliRequestHandler.GpdCliRequestHandler()
result = req.storeGpdXmlProduct(gpdXML)
if result==None:
print("Store action failed!")
else:
print(result)
def __saveProdGempak(options):
# read in XML from input file
gpkfile = io.open(options.filePath, 'rb')
gpdGempak = gpkfile.read()
gpkfile.close()
# Store GPD report to EDEX
req= GpdCliRequestHandler.GpdCliRequestHandler()
maxNumLevel = options.maxNumLevel
if(options.versionNum == None):
result = req.storeGpdGempakProduct(gpdGempak,options.prodName,int(maxNumLevel),0)
else:
result = req.storeGpdGempakProduct(gpdGempak,options.prodName,int(maxNumLevel),int(options.versionNum))
if result==None:
print("Store action failed!")
else:
print(result)
def main():
__initLogger()
#logger.info("Starting Query report.")
options = __parseCommandLine()
#vars(options)
options.func(options)
#logger.info("queried report name: " + options.prodName)
return 0
if __name__ == '__main__':
main()

Binary file not shown.

View file

@ -1,129 +1,128 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using VizLauncher.com.raytheon.viz.launcher.environment;
namespace VizLauncher.com.raytheon.viz.launcher.process
{
public abstract class AbstractProcessLauncher : IProcessLauncher
{
private static readonly String LOG_DATE_FORMAT = "yyyyMMdd_HHmmss";
protected static readonly String LOG_SUFFIX = ".log";
protected Process process = null;
private StreamWriter logFileWriter;
private bool ready = false;
private String exceptionText = null;
public AbstractProcessLauncher(VizEnvironment vizEnvironment)
{
// Prepare the log file.
if (Directory.Exists(vizEnvironment.getLogDirectory()) == false)
{
Directory.CreateDirectory(vizEnvironment.getLogDirectory());
}
String logName = vizEnvironment.getLogDirectory() +
Path.DirectorySeparatorChar + this.constructLogName(this.determineLogDate());
// Prepare the process.
this.process = new Process();
this.process.StartInfo = this.constructProcessStartInfo(vizEnvironment);
this.process.OutputDataReceived += new DataReceivedEventHandler(processOutputHandler);
this.validate();
if (this.ready == false)
{
return;
}
/*
* Access the log file for write access; other processes will have read-only access to
* the log file until it is closed.
**/
this.logFileWriter =
new StreamWriter(File.Open(logName, FileMode.Append,
FileAccess.Write, FileShare.Read));
}
private String determineLogDate()
{
return DateTime.Now.ToString(LOG_DATE_FORMAT);
}
private ProcessStartInfo constructProcessStartInfo(VizEnvironment vizEnvironment)
{
ProcessStartInfo processStartInfo =
new ProcessStartInfo(this.constructProcessName(vizEnvironment.getLocation()));
processStartInfo.EnvironmentVariables.Remove(EnvironmentProperties.ENVIRONMENT_VARIABLE_PATH);
processStartInfo.EnvironmentVariables.Add(
EnvironmentProperties.ENVIRONMENT_VARIABLE_PATH, vizEnvironment.getPath());
processStartInfo.EnvironmentVariables.Add(
EnvironmentProperties.ENVIRONMENT_VARIABLE_PYTHON_PATH, vizEnvironment.getPythonPath());
processStartInfo.UseShellExecute = false;
processStartInfo.Arguments = this.getCommandLineArguments();
processStartInfo.RedirectStandardOutput = true;
return processStartInfo;
}
protected void validate()
{
String application = this.process.StartInfo.FileName;
/* ensure that the specified application exists. */
if (File.Exists(application) == false)
{
this.ready = false;
this.exceptionText = "Unable to find the specified Viz application: " + application;
return;
}
this.ready = true;
}
public virtual void launchProcess()
{
this.runProcess();
this.closeLog();
}
protected void runProcess()
{
this.process.Start();
this.process.BeginOutputReadLine();
this.process.WaitForExit();
this.process.CancelOutputRead();
}
protected void closeLog()
{
this.logFileWriter.Close();
}
private void processOutputHandler(Object sendingProcess, DataReceivedEventArgs outline)
{
if (String.IsNullOrEmpty(outline.Data))
{
return;
}
this.logFileWriter.WriteLine(outline.Data);
}
public bool isReady()
{
return this.ready;
}
public String getExceptionText()
{
return this.exceptionText;
}
protected abstract String constructProcessName(String location);
protected abstract String constructLogName(String logDate);
protected abstract String getCommandLineArguments();
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using VizLauncher.com.raytheon.viz.launcher.environment;
namespace VizLauncher.com.raytheon.viz.launcher.process
{
public abstract class AbstractProcessLauncher : IProcessLauncher
{
private static readonly String LOG_DATE_FORMAT = "yyyyMMdd_HHmmss";
protected static readonly String LOG_SUFFIX = ".log";
protected Process process = null;
private StreamWriter logFileWriter;
private bool ready = false;
private String exceptionText = null;
public AbstractProcessLauncher(VizEnvironment vizEnvironment)
{
// Prepare the log file.
if (Directory.Exists(vizEnvironment.getLogDirectory()) == false)
{
Directory.CreateDirectory(vizEnvironment.getLogDirectory());
}
String logName = vizEnvironment.getLogDirectory() +
Path.DirectorySeparatorChar + this.constructLogName(this.determineLogDate());
// Prepare the process.
this.process = new Process();
this.process.StartInfo = this.constructProcessStartInfo(vizEnvironment);
this.process.OutputDataReceived += new DataReceivedEventHandler(processOutputHandler);
this.validate();
if (this.ready == false)
{
return;
}
/*
* Access the log file for write access; other processes will have read-only access to
* the log file until it is closed.
**/
this.logFileWriter =
new StreamWriter(File.Open(logName, FileMode.Append,
FileAccess.Write, FileShare.Read));
}
private String determineLogDate()
{
return DateTime.Now.ToString(LOG_DATE_FORMAT);
}
private ProcessStartInfo constructProcessStartInfo(VizEnvironment vizEnvironment)
{
ProcessStartInfo processStartInfo =
new ProcessStartInfo(this.constructProcessName(vizEnvironment.getLocation()));
processStartInfo.EnvironmentVariables[EnvironmentProperties.ENVIRONMENT_VARIABLE_PATH] =
vizEnvironment.getPath();
processStartInfo.EnvironmentVariables[EnvironmentProperties.ENVIRONMENT_VARIABLE_PYTHON_PATH] =
vizEnvironment.getPythonPath();
processStartInfo.UseShellExecute = false;
processStartInfo.Arguments = this.getCommandLineArguments();
processStartInfo.RedirectStandardOutput = true;
return processStartInfo;
}
protected void validate()
{
String application = this.process.StartInfo.FileName;
/* ensure that the specified application exists. */
if (File.Exists(application) == false)
{
this.ready = false;
this.exceptionText = "Unable to find the specified Viz application: " + application;
return;
}
this.ready = true;
}
public virtual void launchProcess()
{
this.runProcess();
this.closeLog();
}
protected void runProcess()
{
this.process.Start();
this.process.BeginOutputReadLine();
this.process.WaitForExit();
this.process.CancelOutputRead();
}
protected void closeLog()
{
this.logFileWriter.Close();
}
private void processOutputHandler(Object sendingProcess, DataReceivedEventArgs outline)
{
if (String.IsNullOrEmpty(outline.Data))
{
return;
}
this.logFileWriter.WriteLine(outline.Data);
}
public bool isReady()
{
return this.ready;
}
public String getExceptionText()
{
return this.exceptionText;
}
protected abstract String constructProcessName(String location);
protected abstract String constructLogName(String logDate);
protected abstract String getCommandLineArguments();
}
}

View file

@ -26,7 +26,7 @@
<option id="gnu.cpp.compiler.exe.release.option.optimization.level.208885184" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
<option id="gnu.cpp.compiler.exe.release.option.debugging.level.1161967936" name="Debug Level" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.include.paths.1128011603" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/qpid/include}&quot;"/>
<listOptionValue builtIn="false" value="/awips2/qpid/include"/>
<listOptionValue builtIn="false" value="/usr/local/ldm-6.8.1/src/config"/>
<listOptionValue builtIn="false" value="/usr/local/ldm-6.8.1/src/protocol"/>
<listOptionValue builtIn="false" value="/usr/local/ldm-6.8.1/src/ulog"/>
@ -84,424 +84,424 @@
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.375046330;cdt.managedbuild.config.gnu.exe.release.375046330.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1192057398;cdt.managedbuild.tool.gnu.cpp.compiler.input.1743926560">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.375046330;cdt.managedbuild.config.gnu.exe.release.375046330.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1809941717;cdt.managedbuild.tool.gnu.c.compiler.input.329001407">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1877956122;cdt.managedbuild.config.gnu.exe.debug.1877956122.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.974131962;cdt.managedbuild.tool.gnu.cpp.compiler.input.865889016">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1877956122;cdt.managedbuild.config.gnu.exe.debug.1877956122.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.382778888;cdt.managedbuild.tool.gnu.c.compiler.input.557265334">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
</storageModule>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="edexBridge.cdt.managedbuild.target.gnu.exe.32670172" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.375046330;cdt.managedbuild.config.gnu.exe.release.375046330.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1809941717;cdt.managedbuild.tool.gnu.c.compiler.input.329001407">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.375046330;cdt.managedbuild.config.gnu.exe.release.375046330.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1192057398;cdt.managedbuild.tool.gnu.cpp.compiler.input.1743926560">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1877956122;cdt.managedbuild.config.gnu.exe.debug.1877956122.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.974131962;cdt.managedbuild.tool.gnu.cpp.compiler.input.865889016">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1877956122;cdt.managedbuild.config.gnu.exe.debug.1877956122.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.382778888;cdt.managedbuild.tool.gnu.c.compiler.input.557265334">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
</storageModule>
</cproject>

View file

@ -3,21 +3,21 @@
*
* Created on: Oct 8, 2009
* Author: brockwoo
* Updated on: June 21, 2013 (Re-written to work with the qpid messaging api)
* Author: bkowal
*/
// START SNIPPET: demo
#include <qpid/client/Connection.h>
#include <qpid/client/Session.h>
#include <qpid/client/Message.h>
#include <qpid/client/MessageListener.h>
#include <qpid/client/SubscriptionManager.h>
#include <qpid/messaging/Connection.h>
#include <qpid/messaging/Session.h>
#include <qpid/messaging/Message.h>
#include <qpid/messaging/Sender.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <memory>
#include <filel.h>
#include <ulog.h>
@ -26,8 +26,7 @@
#include <sys/time.h>
#include <list>
using namespace qpid::client;
using namespace qpid::framing;
using namespace qpid::messaging;
using namespace std;
class LdmProducer {
@ -35,23 +34,31 @@ private:
Connection connection;
Session session;
Sender sender;
bool useTopic;
bool sessionTransacted;
bool isConnected;
std::string brokerURI;
int portNumber;
std::string username;
std::string password;
list<string> filenameList;
list<string> headerList;
public:
LdmProducer(const std::string& brokerURI, int port = 5672, bool useTopic =
false, bool sessionTransacted = false) {
LdmProducer(const std::string& brokerURI, int port = 5672,
const std::string& username = "guest",
const std::string& password = "guest",
bool useTopic = false, bool sessionTransacted = false)
{
this->useTopic = useTopic;
this->sessionTransacted = sessionTransacted;
this->brokerURI = brokerURI;
this->isConnected = false;
this->portNumber = port;
this->username = username;
this->password = password;
}
~LdmProducer() {
@ -82,20 +89,19 @@ public:
try {
while (!this->filenameList.empty()) {
Message message;
message.getDeliveryProperties().setRoutingKey(
"external.dropbox");
fileLocation = this->filenameList.front();
fileHeader = this->headerList.front();
struct timeval tv;
gettimeofday(&tv, NULL);
long long current = (((long long) tv.tv_sec) * 1000000
uint64_t current = (((long long) tv.tv_sec) * 1000000
+ ((long long) tv.tv_usec)) / 1000;
message.getDeliveryProperties().setDeliveryMode(PERSISTENT);
message.setData(fileLocation);
message.getHeaders().setString("header", fileHeader);
message.getHeaders().setInt64("enqueueTime", current);
session.messageTransfer(arg::content = message,
arg::destination = "amq.direct");
message.setDurable(true);
message.setContent(fileLocation);
message.getProperties()["header"] = fileHeader;
message.getProperties()["enqueueTime"] = current;
this->sender.send(message);
this->filenameList.pop_front();
this->headerList.pop_front();
@ -103,7 +109,6 @@ public:
}
} catch (const std::exception& error) {
// Error occurred during communication. Clean up the connection and return the number of messages processed.
uerror(error.what());
cleanup();
}
@ -112,31 +117,94 @@ public:
private:
void cleanup() {
cout << "Cleaning up\n";
void cleanup()
{
unotice ("Cleaning up");
// Destroy resources.
try {
session.close();
connection.close();
} catch (const std::exception& error) {
this->isConnected = false;
if (this->sender != 0)
{
try
{
this->sender.close();
this->sender = 0;
}
catch (const std::exception& error)
{
uwarn(error.what());
}
}
if (this->session != 0)
{
try
{
this->session.close();
this->session = 0;
}
catch (const std::exception& error)
{
uwarn(error.what());
}
}
if (this->connection != 0)
{
try
{
this->connection.close();
this->connection = 0;
}
catch (const std::exception& error)
{
uwarn(error.what());
}
}
this->isConnected = false;
}
bool connect() {
if (this->isConnected) {
bool connect()
{
if (this->isConnected)
{
return this->isConnected;
}
try {
this->connection.open(brokerURI, portNumber);
this->session = this->connection.newSession();
session.queueDeclare(arg::queue = "external.dropbox", arg::durable=true);
session.exchangeBind(arg::exchange = "amq.direct", arg::queue
= "external.dropbox", arg::bindingKey = "external.dropbox");
try
{
// initialize
this->connection = 0;
this->session = 0;
this->sender = 0;
std::stringstream qpidURLBuilder;
qpidURLBuilder << "amqp:tcp:";
qpidURLBuilder << this->brokerURI;
qpidURLBuilder << ":";
qpidURLBuilder << this->portNumber;
std::string qpidURL = qpidURLBuilder.str();
std::stringstream connectionOptionsBuilder;
connectionOptionsBuilder << "{sasl-mechanism:PLAIN,username:";
connectionOptionsBuilder << this->username;
connectionOptionsBuilder << ",password:";
connectionOptionsBuilder << this->password;
connectionOptionsBuilder << "}";
std::string connectionOptions = connectionOptionsBuilder.str();
this->connection = Connection(qpidURL, connectionOptions);
this->connection.open();
std::string address = "external.dropbox; {node:{type:queue,durable:true,x-bindings:"
"[{exchange:amq.direct,queue:external.dropbox,key:external.dropbox}]}}";
this->session = this->connection.createSession();
this->sender = this->session.createSender(address);
this->isConnected = true;
} catch (const std::exception& error) {
}
catch (const std::exception& error)
{
uerror(error.what());
this->isConnected = false;
}
return this->isConnected;
@ -231,6 +299,8 @@ int main(int argc, char* argv[]) {
int loggingToStdErr = 0;
std::string brokerURI = "127.0.0.1";
int port = 5672;
std::string username = "guest";
std::string password = "guest";
{
extern char *optarg;
@ -281,7 +351,6 @@ int main(int argc, char* argv[]) {
// createQueue to be used in both consumer an producer.
//============================================================
bool useTopics = false;
//bool sessionTransacted = false;
int shmid;
int semid;
@ -309,7 +378,7 @@ int main(int argc, char* argv[]) {
messageCursor = (edex_message *) shmat(shmid, (void *) 0, 0);
LdmProducer producer(brokerURI, port, useTopics);
LdmProducer producer(brokerURI, port, username, password, useTopics);
for (;;) {
if (hupped) {

View file

@ -485,4 +485,19 @@
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.common.dataplugin.gpd"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="gov.noaa.nws.ncep.edex.plugin.gpd"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View file

@ -27,12 +27,12 @@
* Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation.
* May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject.
* July 29, 2013 1028 ghull add AwwReportType enum
*
* </pre>
*
* This code has been developed by the SIB for use in the AWIPS2 system.
*/
package gov.noaa.nws.ncep.common.dataplugin.aww;
import java.util.Calendar;
@ -86,6 +86,69 @@ public class AwwRecord extends PluginDataObject {
* REPORT 27. HIGH WIND WARNING 28. FREEZE WARNING 29. ADVERTENCIA DE
* INUNDACIONES 30. HYDROLOGIC STATEMENT 31. URGENT WEATHER MESSAGE
*/
public static enum AwwReportType {
SEVERE_THUNDERSTORM_WARNING,
SEVERE_THUNDERSTORM_WATCH,
TORNADO_WARNING,
TORNADO_WATCH,
SEVERE_THUNDERSTORM_OUTLINE_UPDATE,
TORNADO_WATCH_OUTLINE_UPDATE,
FLASH_FLOOD_WARNING,
FLASH_FLOOD_WATCH,
FLOOD_WARNING,
FLOOD_WATCH,
FLOOD_STATEMENT,
// WINTER STORM. something is getting decoded as WINTER STORM
WINTER_STORM_WARNING,
WINTER_STORM_WATCH,
WATCH_COUNTY_NOTIFICATION,
SEVERE_WEATHER_STATEMENT,
WIND_ADVISORY, // ?WIND CHILL ADVISORY?
// WIND CHILL ADVISORYs getting decoded as "ADVISORY"
FOG_ADVISORY,
HEAT_ADVISORY,
FROST_ADVISORY,
SMOKE_ADVISORY,
WEATHER_ADVISORY,
WINTER_WEATHER_ADVISORY,
SIGNIGICANT_WEATHER_ADVISORY,
SPECIAL_WEATHER_STATEMENT,
RED_FLAG_WARNING,
TORNADO_REPORT,
HIGH_WIND_WARNING,
FREEZE_WARNING,
ADVERTENCIA_DE_INUNDACIONES,
HYDROLOGIC_STATEMENT,
URGENT_WEATHER_MESSAGE,
UNKNOWN_AWW_REPORT_TYPE,
// DON"T know what this is but WTCH is looking for it (isSevereWeatherStatusNotification)?
STATUS_REPORT;
public static AwwReportType getReportType( String rtStr ) {
rtStr = rtStr.trim().replace(" ", "_" );
for( AwwReportType rt : values() ) {
if( rt.toString().equals( rtStr ) ) {
return rt;
}
}
// WTCH is looking for
if( rtStr.equals("THUNDERSTORM_REPORT" ) ) {
return SEVERE_THUNDERSTORM_WATCH;
}
if( rtStr.endsWith( "STATUS REPORT" ) ) {
// ??? return AwwReportType.SEVERE_WEATHER_STATUS_NOTIFICATION
}
// WSTM is looking for
if( rtStr.equals( "WINTER_STORM" ) ) {
// ???
}
if( rtStr.equals( "ADVISORY" ) ) {
// ???? WIND CHILL ADVISORY is getting decoded as "ADVISORY"???
}
return UNKNOWN_AWW_REPORT_TYPE;
}
}
@Column(length = 40)
@DataURI(position = 1)
@DynamicSerializeElement

View file

@ -0,0 +1,74 @@
package gov.noaa.nws.ncep.common.dataplugin.aww;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// *** Copied from raytheon's class in com.raytheon.edex.warning.
// TODO : get this moved to a common plugin.
public class UGCHeaderUtil {
/** Another RE to Catch the Date portion of the UGC Header */
private static final String DATESTR = "[0-9]{6}\\-";
/** Parses a single county from a UGC Header, can be repeated */
private static final String SINGLECOUNTY = "(?:([A-Z]{3}[0-9]{3})([\\-\\>]))|(?:([0-9]{3})[\\-\\>])";
/**
* Private utility method which will return an ArrayList of each zone
* formatted from a UGC Header.
*
* @param fips
* @return
*/
public static ArrayList<String> getUGCZones(String fips) {
ArrayList<String> rval = new ArrayList<String>();
String matchStr = "";
Pattern pattern = Pattern.compile(DATESTR);
Matcher matcher = pattern.matcher(fips);
if (matcher.find()) {
matchStr = fips.substring(0, fips.length() - 7);
} else {
matchStr = fips;
}
if (!matchStr.endsWith("-")) {
matchStr += "-";
}
String currentState = "";
String startOfSeries = "";
pattern = Pattern.compile(SINGLECOUNTY);
matcher = pattern.matcher(matchStr);
while (matcher.find()) {
if (matcher.group(1) != null && matcher.group(1).length() == 6) {
currentState = matcher.group(1).substring(0, 3);
rval.add(matcher.group(1));
if (matcher.group(2).equals(">")) {
startOfSeries = matcher.group(1).substring(3, 6);
}
} else {
rval.add(currentState + matcher.group(3));
if (!startOfSeries.equals("")) {
int start = Integer.parseInt(startOfSeries);
int end = Integer.parseInt(matcher.group(3));
for (int i = start + 1; i < end; i++) {
String str = String.valueOf(i);
while (str.length() < 3) {
str = "0" + str;
}
rval.add(currentState + str);
}
startOfSeries = "";
}
if (matcher.group(2) != null && matcher.group(2).equals(">")) {
startOfSeries = matcher.group(1).substring(3, 6);
}
}
}
return rval;
}
}

View file

@ -1,3 +1,4 @@
gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagRecord
gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSource
gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSourcePreference
gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagAvg
gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagK1min
gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagK3hr

View file

@ -1,5 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
res/
.

View file

@ -1,3 +0,0 @@
INSERT INTO awips.geomag_source_preferences VALUES (201, 'Primary', 1);
INSERT INTO awips.geomag_source_preferences VALUES (202, 'Secondary', 2);
INSERT INTO awips.geomag_source_preferences VALUES (203, 'Tertiary', 3);

View file

@ -1,3 +0,0 @@
INSERT INTO awips.geomag_sources VALUES (101, 201, 'Data transmitted directly via the Magworm protocol from the Table Mountain Observatory (TMO).', 'direct');
INSERT INTO awips.geomag_sources VALUES (102, 202, 'Data transmitted directly via the Magworm protocol from USGS Golden, CO.', 'magworm');
INSERT INTO awips.geomag_sources VALUES (103, 203, 'Data originally transmitted via GOES and then through the Magworm protocol from USGS Golden, CO.', 'domsat');

View file

@ -0,0 +1,173 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
//import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
/**
* Record implementation for geomag avg.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ---------------- --------------------------
* 08/14/2013 T989 qzhou Initial creation.
* </pre>
*
* @author qzhou
* @version 1.0
*/
@Entity
@SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "geomagseq")
@Table(name = "geomag_houravg")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public class GeoMagAvg extends PersistableDataObject<Object> {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String ID_GEN = "idgen";
/** The id */
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_GEN)
private Integer id;
/**
* station code
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private String stationCode;
/**
* time tag
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private Date avgTime;
/**
* insert time tag
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private Date insertTime;
/**
* H data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float hHrAvg;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float dHrAvg;
public GeoMagAvg() {
}
public void generateId() {
this.id = hashCode();
}
/**
* @return the hHrAvg
*/
public float getHHrAvg() {
return hHrAvg;
}
public void setHHrAvg(float hHrAvg) {
this.hHrAvg = hHrAvg;
}
/**
* @return the dHrAvg
*/
public float getDHrAvg() {
return dHrAvg;
}
public void setDHrAvg(float dHrAvg) {
this.dHrAvg = dHrAvg;
}
/**
* @return The id
*/
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
* @return the timeTag
*/
public Date getAvgTime() {
return avgTime;
}
public void setAvgTime(Date avgTime) {
this.avgTime = avgTime;
}
/**
* @return the timeTag
*/
public Date getInsertTime() {
return insertTime;
}
public void setInsertTime(Date insertTime) {
this.insertTime = insertTime;
}
/**
* @return the stationCode
*/
public String getStationCode() {
return stationCode;
}
public void setStationCode(String stationCode) {
this.stationCode = stationCode;
}
}

View file

@ -0,0 +1,365 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
/**
* Record implementation for geomag k 1 min.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ---------------- --------------------------
* 08/14/2013 T989 qzhou Initial creation.
* </pre>
*
* @author qzhou
* @version 1.0
*/
@Entity
@Table(name = "geomag_k1min")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public class GeoMagK1min extends PersistableDataObject<Object> {
/**
*
*/
private static final long serialVersionUID = 1L;
/** The id */
@Id
@DynamicSerializeElement
private Integer id;
/**
* station code
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private String stationCode;
/**
* time tag
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private Date refTime;
/**
* insert time tag
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private Date lastUpdate;
/**
* H data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int kestIndex;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float kestReal;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float kestGamma;
/**
* H data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int hkIndex;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float hkReal;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float hkGamma;
/**
* H data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int dkIndex;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float dkReal;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float dkGamma;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int hCount;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int dCount;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int aest;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float ks;
public GeoMagK1min() {
}
public void generateId() {
this.id = hashCode();
}
/**
* @return the hHrAvg
*/
public int getKestIndex() {
return kestIndex;
}
public void setKestIndex(int kestIndex) {
this.kestIndex = kestIndex;
}
/**
* @return the dHrAvg
*/
public float getKestReal() {
return kestReal;
}
public void setKestReal(float kestReal) {
this.kestReal = kestReal;
}
/**
* @return the hHrAvg
*/
public float getKestGamma() {
return kestGamma;
}
public void setKestGamma(float kestGamma) {
this.kestGamma = kestGamma;
}
/**
* @return the hHrAvg
*/
public int getHkIndex() {
return hkIndex;
}
public void setHKIndex(int hkIndex) {
this.hkIndex = hkIndex;
}
/**
* @return the dHrAvg
*/
public float getHKReal() {
return hkReal;
}
public void setHKReal(float hkReal) {
this.hkReal = hkReal;
}
/**
* @return the hHrAvg
*/
public float getHKGamma() {
return hkGamma;
}
public void setHKGamma(float hkGamma) {
this.hkGamma = hkGamma;
}
/**
* @return the hHrAvg
*/
public int getDKIndex() {
return dkIndex;
}
public void setDKIndex(int dkIndex) {
this.dkIndex = dkIndex;
}
/**
* @return the dHrAvg
*/
public float getDKReal() {
return dkReal;
}
public void setDKReal(float dkReal) {
this.dkReal = dkReal;
}
/**
* @return the hHrAvg
*/
public float getDKGamma() {
return dkGamma;
}
public void setDKGamma(float dkGamma) {
this.dkGamma = dkGamma;
}
/**
* @return the dHrAvg
*/
public float getHCount() {
return hCount;
}
public void setHCount(int hCount) {
this.hCount = hCount;
}
/**
* @return the dHrAvg
*/
public int getDCount() {
return dCount;
}
public void setDCount(int dCount) {
this.dCount = dCount;
}
/**
* @return the dHrAvg
*/
public int getAest() {
return aest;
}
public void setAest(int aest) {
this.aest = aest;
}
/**
* @return the dHrAvg
*/
public float getKs() {
return ks;
}
public void setKs(float ks) {
this.ks = ks;
}
/**
* @return The id
*/
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
* @return the timeTag
*/
public Date getRefTime() {
return refTime;
}
public void setRefTime(Date refTime) {
this.refTime = refTime;
}
/**
* @return the timeTag
*/
public Date getLastUpdate() {
return lastUpdate;
}
public void setLastUpdate(Date lastUpdate) {
this.lastUpdate = lastUpdate;
}
/**
* @return the stationCode
*/
public String getStationCode() {
return stationCode;
}
public void setStationCode(String stationCode) {
this.stationCode = stationCode;
}
}

View file

@ -0,0 +1,203 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
/**
* Record implementation for geomag k 3 hr.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ---------------- --------------------------
* 08/14/2013 T989 qzhou Initial creation.
* </pre>
*
* @author qzhou
* @version 1.0
*/
@Entity
@Table(name = "geomag_k3hr")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public class GeoMagK3hr extends PersistableDataObject<Object> {
/**
*
*/
private static final long serialVersionUID = 1L;
/** The id */
@Id
@DynamicSerializeElement
private Integer id;
/**
* station code
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private String stationCode;
/**
* time tag
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private Date refTime;
/**
* insert time tag
*/
@Column
@XmlAttribute
@DynamicSerializeElement
private Date lastUpdate;
/**
* H data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private int kIndex;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float kReal;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float kGamma;
/**
* D data Hour Average
*/
@Column(length=16)
@DynamicSerializeElement
private float aFinalRunning;
public GeoMagK3hr() {
}
public void generateId() {
this.id = hashCode();
}
/**
* @return the hHrAvg
*/
public int getKIndex() {
return kIndex;
}
public void setKIndex(int kIndex) {
this.kIndex = kIndex;
}
/**
* @return the dHrAvg
*/
public float getKReal() {
return kReal;
}
public void setKReal(float kReal) {
this.kReal = kReal;
}
/**
* @return the hHrAvg
*/
public float getKGamma() {
return kGamma;
}
public void setKGamma(float kGamma) {
this.kGamma = kGamma;
}
/**
* @return the dHrAvg
*/
public float getAFinalRunning() {
return aFinalRunning;
}
public void setAFinalRunning(float aFinalRunning) {
this.aFinalRunning = aFinalRunning;
}
/**
* @return The id
*/
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
* @return the timeTag
*/
public Date getRefTime() {
return refTime;
}
public void setRefTime(Date refTime) {
this.refTime = refTime;
}
/**
* @return the timeTag
*/
public Date getLastUpdate() {
return lastUpdate;
}
public void setLastUpdate(Date lastUpdate) {
this.lastUpdate = lastUpdate;
}
/**
* @return the stationCode
*/
public String getStationCode() {
return stationCode;
}
public void setStationCode(String stationCode) {
this.stationCode = stationCode;
}
}

View file

@ -0,0 +1,54 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag;
import java.util.Date;
import com.raytheon.uf.common.dataplugin.persist.DefaultPathProvider;
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
public class GeoMagPathProvider extends DefaultPathProvider {
private static GeoMagPathProvider instance = new GeoMagPathProvider();
public static GeoMagPathProvider getInstance() {
return instance;
}
protected GeoMagPathProvider() {
}
@Override
public String getHDFFileName(String pluginName, IPersistable persistable) {
if (persistable == null) {
throw new IllegalArgumentException(
"Expected argument persistable is null");
}
if (!(persistable instanceof GeoMagRecord)) {
throw new IllegalArgumentException(
"Argument persistable is of wrong type. Expected "
+ GeoMagRecord.class + " but got "
+ persistable.getClass());
}
if (pluginName == null) {
throw new IllegalArgumentException(
"Expected argument pluginName not set on object "
+ persistable.toString());
}
GeoMagRecord pdo = (GeoMagRecord) persistable;
StringBuffer sb = new StringBuffer(64);
sb.append(pluginName);
if (pdo.getDataTime() != null ) {
Date time = (Date) pdo.getDataTime().getRefTime().clone();
time.setHours(0);
// //System.out.println("***Path "+pdo.getDataTime().getRefTime() +" "+ fileNameFormat.get().format(pdo.getDataTime().getRefTime()));
sb.append(fileNameFormat.get().format(time));
sb.append(".h5");
}
return sb.toString();
}
}

View file

@ -16,16 +16,12 @@ import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.dataplugin.IDecoderGettable;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.annotations.DataURI;
import com.raytheon.uf.common.dataplugin.persist.IHDFFilePathProvider;
import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.datastorage.records.LongDataRecord;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
/**
* Record implementation for geomag plugin.
* Record implementation for geomag plugin.
*
* <pre>
* SOFTWARE HISTORY
@ -35,6 +31,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
* May 26, 2013 bhebbard Added SequenceGenerator
* annotation.
* Jul 22, 2013 1977 rjpeter Added getDataURI and annotations.
* Jul 26, 2013 989 qzhou Added lots of fields.
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
* </pre>
*
@ -52,16 +49,49 @@ public class GeoMagRecord extends PersistablePluginDataObject {
private static final long serialVersionUID = 1L;
public static final String OBS_TIME = "OBS_TIME";
public static final String component1 = "component1";
public static final String component2 = "component2";
public static final String component3 = "component3";
public static final String component4 = "component4";
public static final String OBS_TIME = "Obs_Time";//h5
public static final String Comp_Insert_Time = "Comp_Insert_Time";
public static final String component1 = "Component1";
public static final String component2 = "Component2";
public static final String component3 = "Component3";
public static final String component4 = "Component4";
public static final String H_HR_AVG = "Hr_Avg_H";
public static final String D_HR_AVG = "Hr_Avg_D";
public static final String K_Index = "P3h_K_Index";
public static final String K_Real = "P3h_K_Real";
public static final String K_Gamma = "P3h_Gamma";
public static final String Kest_Index = "P3h_Kest_Index";
public static final String Kest_Real = "P3h_Kest_Real";
public static final String Kest_Gamma = "P3h_Kest_Gamma";
public static final String KH_Real = "P3h_Hk_Real";
public static final String KH_Gamma = "P3h_H_Gamma";
public static final String KD_Real = "P3h_Dk_Real";
public static final String KD_Gamma = "P3h_D_Gamma";
public static final String A_Running = "P3h_A_Running";
public static final String A_Final_Running = "P3h_A_Final_Running";
public static final String KH_Int = "P3h_Hk_Int";
public static final String KD_Int = "P3h_Dk_Int";
public static final String Last_Update = "P3h_Last_Update";
public static final String Kest_Index_1m = "P1m_Kest_Index";
public static final String Kest_Real_1m = "P1m_Kest_Real";
public static final String Kest_Gamma_1m = "P1m_Kest_Gamma";
public static final String KH_Real_1m = "P1m_Hk_Real";
public static final String KH_Gamma_1m = "P1m_H_Gamma";
public static final String KH_Index_1m = "P1m_Hk_Index";
public static final String KD_Real_1m = "P1m_Dk_Real";
public static final String KD_Gamma_1m = "P1m_D_Gamma";
public static final String KD_Index_1m = "P1m_Dk_Index";
public static final String KH_Count = "P1m_H_Count";
public static final String KD_Count = "P1m_D_Count";
public static final String KH_Dev = "P1m_H_Dev";
public static final String KD_Dev = "P1m_D_Dev";
public static final String A_est = "P1m_A_est";
public static final String K_s = "P1m_K_s";
public static final String Last_Update_1m = "P1m_Last_Update";
/**
* station code
*/
@ -84,52 +114,160 @@ public class GeoMagRecord extends PersistablePluginDataObject {
* report type
*/
@DataURI(position = 3)
@Column
@Column
@DynamicSerializeElement
@XmlAttribute
private String reportType;
// /**
// * index for data in hdf5, 0-1439
// */
// @Column
// @DynamicSerializeElement
// @XmlAttribute
// private int idx;
/**
* flag to indicate bad data point
*/
/*
* @Column
*
* @DynamicSerializeElement
*
* @XmlAttribute private String badDataPoint;
@Column
@DynamicSerializeElement
@XmlAttribute
private String badDataPoint;
/**
* H or X values
*/
@Column
@DynamicSerializeElement
@XmlAttribute
private float component_1;
/**
* D or Y values
*/
@Column
@DynamicSerializeElement
@XmlAttribute
private float component_2;
/**
* Z values
*/
@Column
@DynamicSerializeElement
@XmlAttribute
private float component_3;
/**
* F values
*/
@Column
@DynamicSerializeElement
@XmlAttribute
private float component_4;
/**
* Observation Date and Time for the minute values
*/
@Transient
private long[] obs_times;
/**
* H or X values
*/
@Transient
private float[] comp1_data;
/**
* D or Y values
*/
@Transient
private float[] comp2_data;
/**
* Z values
*/
@Transient
private float[] comp3_data;
/**
* F values
*/
@Transient
private float[] comp4_data;
/**
* Following for HrAvg values
*/
@Transient
private float[] hrAvgH;
@Transient
private float[] hrAvgD;
@Transient
private long[] comp_InsertTime;
/**
* Following for K values
*/
// 3hr
@Transient
private int[] kK_Index;
@Transient
private float[] kK_Real;
@Transient
private float[] kK_Gamma;
@Transient
private int[] kest_Index;
@Transient
private float[] kest_Real;
@Transient
private float[] kest_Gamma;
@Transient
private float[] hK_Real;
@Transient
private float[] hK_Gamma;
@Transient
private float[] dK_Real;
@Transient
private float[] dK_Gamma;
// 1 min
@Transient
private int[] h_Count;
@Transient
private int[] d_Count;
@Transient
private int[] kest_Index_1m;
@Transient
private float[] kest_Real_1m;
@Transient
private float[] kest_Gamma_1m;
@Transient
private float[] hK_Real_1m;
@Transient
private float[] hK_Gamma_1m;
@Transient
private float[] dK_Real_1m;
@Transient
private float[] dK_Gamma_1m;
@Transient
private int[] hK_Index_1m;
@Transient
private int[] dK_Index_1m;
@Transient
private float[] h_Dev;
@Transient
private float[] d_Dev;
@Transient
private float[] Ks;
@Transient
private int[] a_est;
@Transient
private float[] update_1m;
/**
* No-arg Constructor
*/
@ -161,7 +299,7 @@ public class GeoMagRecord extends PersistablePluginDataObject {
public void setStationCode(String stationCode) {
this.stationCode = stationCode;
}
/**
* @return the sourceId
*/
@ -176,7 +314,21 @@ public class GeoMagRecord extends PersistablePluginDataObject {
public void setSourceId(int sourceId) {
this.sourceId = sourceId;
}
/**
* @return the badDataPoint
*/
public String getBadDataPoint() {
return badDataPoint;
}
/**
* @param the badDataPoint to set
*/
public void setBadDataPoint(String badDataPoint) {
this.badDataPoint = badDataPoint;
}
/**
* @return the reportType
*/
@ -193,50 +345,37 @@ public class GeoMagRecord extends PersistablePluginDataObject {
}
/**
* @return the min_data
* @return the obs_times array
*/
public long[] getObsTimes() {
return obs_times;
}
/**
* @param comp1_data
* the comp1_data to set
*/
public void setObsTimes(long[] obs_times) {
this.obs_times = obs_times;
}
/**
* @return the comp1_data
* @return the comp1_data array
*/
public float[] getComp1Data() {
return comp1_data;
}
/**
* @param comp1_data
* the comp1_data to set
*/
public void setComp1Data(float[] h_data) {
this.comp1_data = h_data;
}
/**
* @return the comp2_data
* @return the comp2_data array
*/
public float[] getComp2Data() {
return comp2_data;
}
/**
* @param comp2_data
* the comp2_data to set
*/
public void setComp2Data(float[] d_data) {
this.comp2_data = d_data;
}
/**
* @return the comp3_data
*/
@ -244,61 +383,347 @@ public class GeoMagRecord extends PersistablePluginDataObject {
return comp3_data;
}
/**
* @param comp3_data
* the comp3_data to set
*/
public void setComp3Data(float[] z_data) {
this.comp3_data = z_data;
}
/**
* @return the comp4_data
*/
public float[] getComp4Data() {
return comp4_data;
}
/**
* @param comp4_data
* the comp4_data to set
*/
public void setComp4Data(float[] f_data) {
this.comp4_data = f_data;
}
/**
* @return the component_1
*/
public float getComponent_1() {
return component_1;
}
public void setComponent_1(float component_1) {
this.component_1 = component_1;
}
/**
* @return the component_2
*/
public float getComponent_2() {
return component_2;
}
public void setComponent_2(float component_2) {
this.component_2 = component_2;
}
/**
* @return the component_3
*/
public float getComponent_3() {
return component_3;
}
public void setComponent_3(float component_3) {
this.component_3 = component_3;
}
/**
* @return the component_4
*/
public float getComponent_4() {
return component_4;
}
public void setComponent_4(float component_4) {
this.component_4 = component_4;
}
/**
* @return the h_HrAvg
*/
public float[] getHrAvgH() {
return hrAvgH;
}
/**
* @param h_HrAvg
*/
public void setHrAvgH(float[] hrAvgH) {
this.hrAvgH = hrAvgH;
}
/**
* @return the d_HrAvg
*/
public float[] getHrAvgD() {
return hrAvgD;
}
/**
* @param d_HrAvg
*/
public void setHrAvgD(float[] hrAvgD) {
this.hrAvgD = hrAvgD;
}
public long[] getCompInsertTime() {
return comp_InsertTime;
}
public void setCompInsertTime(long[] comp_InsertTime) {
this.comp_InsertTime = comp_InsertTime;
}
/*
* @param k index related
*/
// 3hr
public int[] getKKIndex() {
return kK_Index;
}
public void setKKIndex(int[] kK_Index) {
this.kK_Index = kK_Index;
}
public float[] getKKReal() {
return kK_Real;
}
public void setKKReal(float[] kK_Real) {
this.kK_Real = kK_Real;
}
public float[] getKKGamma() {
return kK_Gamma;
}
public void setKKGamma(float[] kK_Gamma) {
this.kK_Gamma = kK_Gamma;
}
public float[] getHKReal() {
return hK_Real;
}
public void setHKReal(float[] hK_Real) {
this.hK_Real = hK_Real;
}
public float[] getDKReal() {
return dK_Real;
}
public void setDKReal(float[] dK_Real) {
this.dK_Real = dK_Real;
}
public int[] getKestIndex() {
return kest_Index;
}
public void setKestIndex(int[] kest_Index) {
this.kest_Index = kest_Index;
}
public float[] getKestReal() {
return kest_Real;
}
public void setKestReal(float[] kest_Real) {
this.kest_Real = kest_Real;
}
public float[] getKestGamma() {
return kest_Gamma;
}
public void setKestGamma(float[] kest_Gamma) {
this.kest_Gamma = kest_Gamma;
}
public float[] getHKGamma() {
return hK_Gamma;
}
public void setHKGamma(float[] hK_Gamma) {
this.hK_Gamma = hK_Gamma;
}
public float[] getDKGamma() {
return dK_Gamma;
}
public void setDKGamma(float[] dK_Gamma) {
this.dK_Gamma = dK_Gamma;
}
// 1min
public float[] getHKReal1m() {
return hK_Real_1m;
}
public void setHKReal1m(float[] hK_Real_1m) {
this.hK_Real_1m = hK_Real_1m;
}
public float[] getDKReal1m() {
return dK_Real_1m;
}
public void setDKReal1m(float[] dK_Real_1m) {
this.dK_Real_1m = dK_Real_1m;
}
public int[] getKestIndex1m() {
return kest_Index_1m;
}
public void setKestIndex1m(int[] kest_Index_1m) {
this.kest_Index_1m = kest_Index_1m;
}
public float[] getKestReal1m() {
return kest_Real_1m;
}
public void setKestReal1m(float[] kest_Real_1m) {
this.kest_Real_1m = kest_Real_1m;
}
public float[] getKestGamma1m() {
return kest_Gamma_1m;
}
public void setKestGamma1m(float[] kest_Gamma_1m) {
this.kest_Gamma_1m = kest_Gamma_1m;
}
public float[] getHKGamma1m() {
return hK_Gamma_1m;
}
public void setHKGamma1m(float[] hK_Gamma_1m) {
this.hK_Gamma_1m = hK_Gamma_1m;
}
public float[] getDKGamma1m() {
return dK_Gamma_1m;
}
public void setDKGamma1m(float[] dK_Gamma_1m) {
this.dK_Gamma_1m = dK_Gamma_1m;
}
public int[] getHKIndex1m() {
return hK_Index_1m;
}
public void setHKIndex1m(int[] hK_Index_1m) {
this.hK_Index_1m = hK_Index_1m;
}
public int[] getDKIndex1m() {
return dK_Index_1m;
}
public void setDKIndex1m(int[] dK_Index_1m) {
this.dK_Index_1m = dK_Index_1m;
}
public int[] getHCount() {
return h_Count;
}
public void setHCount(int[] h_Count) {
this.h_Count = h_Count;
}
public int[] getDCount() {
return d_Count;
}
public void setDCount(int[] d_Count) {
this.d_Count = d_Count;
}
public float[] getHDev() {
return h_Dev;
}
public void setHDev(float[] h_Dev) {
this.h_Dev = h_Dev;
}
public float[] getDDev() {
return d_Dev;
}
public void setDDev(float[] d_Dev) {
this.d_Dev = d_Dev;
}
public float[] getKs() {
return Ks;
}
public void setKs(float[] Ks) {
this.Ks = Ks;
}
public int[] getAest() {
return a_est;
}
public void setAest(int[] a_est) {
this.a_est = a_est;
}
public float[] getLastUpdate() {
return update_1m;
}
public void setLastUpdate(float[] update_1m) {
this.update_1m = update_1m;
}
@Override
public IDecoderGettable getDecoderGettable() {
return null;
}
public void retrieveFromDataStore(IDataStore dataStore) {
try {
IDataRecord[] dataRec = dataStore.retrieve(getDataURI());
for (IDataRecord element : dataRec) {
if (element.getName().equals(GeoMagRecord.component1)) {
obs_times = (((LongDataRecord) element).getLongData());
}
if (element.getName().equals(GeoMagRecord.component1)) {
comp1_data = (((FloatDataRecord) element).getFloatData());
}
if (element.getName().equals(GeoMagRecord.component2)) {
comp2_data = (((FloatDataRecord) element).getFloatData());
}
if (element.getName().equals(GeoMagRecord.component3)) {
comp3_data = (((FloatDataRecord) element).getFloatData());
}
if (element.getName().equals(GeoMagRecord.component4)) {
comp4_data = (((FloatDataRecord) element).getFloatData());
}
}
} catch (Exception se) {
se.printStackTrace();
}
}
// public void retrieveFromDataStore(IDataStore dataStore) {
//
// try {
// IDataRecord[] dataRec = dataStore.retrieve(getDataURI());
// for (int i = 0; i < dataRec.length; i++) {
// if (dataRec[i].getName().equals(GeoMagRecord.OBS_TIME)) {
// obs_times = (((LongDataRecord) dataRec[i]).getLongData());
// }
// if (dataRec[i].getName().equals(GeoMagRecord.component1)) {
// comp1_data = (((FloatDataRecord) dataRec[i]).getFloatData());
// }
// if (dataRec[i].getName().equals(GeoMagRecord.component2)) {
// comp2_data = (((FloatDataRecord) dataRec[i]).getFloatData());
// }
// if (dataRec[i].getName().equals(GeoMagRecord.component3)) {
// comp3_data = (((FloatDataRecord) dataRec[i]).getFloatData());
// }
// if (dataRec[i].getName().equals(GeoMagRecord.component4)) {
// comp4_data = (((FloatDataRecord) dataRec[i]).getFloatData());
// }
// }
//
// } catch (Exception se) {
// se.printStackTrace();
// }
// }
@Override
@Column
@Access(AccessType.PROPERTY)
@ -306,8 +731,14 @@ public class GeoMagRecord extends PersistablePluginDataObject {
return super.getDataURI();
}
@Override
public IHDFFilePathProvider getHDFPathProvider() {
return GeoMagPathProvider.getInstance();
}
@Override
public String getPluginName() {
return "geomag";
}
}

View file

@ -0,0 +1,94 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.dao;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagAvg;
import com.raytheon.uf.edex.database.dao.CoreDao;
import com.raytheon.uf.edex.database.dao.DaoConfig;
/**
* Record implementation for geomag avgDao.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ---------------- --------------------------
* 08/14/2013 T989 qzhou Initial creation.
* </pre>
*
* @author qzhou
* @version 1.0
*/
public class GeoMagAvgDao extends CoreDao {
/**
* Creates a new GribModelDao
*/
public GeoMagAvgDao() {
super(DaoConfig.forClass(GeoMagAvg.class));
}
/**
* Retrieves a GeoMagAvgId based on the given id
*
* @param id
* The given ID number
* @return The GeoMagAvgId
*/
public GeoMagAvg queryById(int id) {
return (GeoMagAvg) super.queryById(id);
}
public int getAreaId (int id){
return queryById(id).getId();
}
@SuppressWarnings("unchecked")
public List<GeoMagAvg> getAvgForStation(final String stationCode, final Date start, final Date end) {
return (List<GeoMagAvg>) txTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
HibernateTemplate ht = getHibernateTemplate();
Session sess = ht.getSessionFactory().getCurrentSession();
Criteria crit = sess.createCriteria(GeoMagAvg.class);
Criterion where1 = Restrictions.eq("stationCode", stationCode);
crit.add(where1);
// Criterion where2 = Restrictions.gt("avgTime", start);
// crit.add(where2);
// Criterion where3 = Restrictions.le("avgTime", end);
// crit.add(where3);
Criterion where2 = Restrictions.between("avgTime", start, end);//include bounds, but don't need bounds
crit.add(where2);
return crit.list();
}
});
}
@SuppressWarnings("unchecked")
public List<GeoMagAvg> getSingleAvg(final String stationCode, final Date date) {
return (List<GeoMagAvg>) txTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
HibernateTemplate ht = getHibernateTemplate();
Session sess = ht.getSessionFactory().getCurrentSession();
Criteria crit = sess.createCriteria(GeoMagAvg.class);
Criterion where1 = Restrictions.eq("stationCode", stationCode);
crit.add(where1);
Criterion where2 = Restrictions.eq("avgTime", date);
crit.add(where2);
return crit.list();
}
});
}
}

View file

@ -1,18 +1,22 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.dao;
import java.util.Date;
import java.util.List;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.datastorage.StorageException;
import com.raytheon.uf.common.datastorage.records.AbstractStorageRecord;
import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
import com.raytheon.uf.common.datastorage.records.LongDataRecord;
import com.raytheon.uf.common.datastorage.records.IntegerDataRecord;
import com.raytheon.uf.edex.database.DataAccessLayerException;
import com.raytheon.uf.edex.database.plugin.PluginDao;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagAvg;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagK1min;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagK3hr;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagRecord;
import gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSource;
import gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSourcePreference;
/**
* This is a Data Access Object (DAO) driver to interact with geomag database table and HDF5 data store.
@ -23,7 +27,7 @@ import gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSourcePreference;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/2013 975 S. Gurung Initial Creation
*
* 07/16/2013 975 Q. Zhou Added fields.
* </pre>
*
* @author sgurung
@ -32,30 +36,183 @@ import gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSourcePreference;
public class GeoMagDao extends PluginDao {
/** The source data access object */
private GeoMagSourceDao sourceDao = new GeoMagSourceDao();
/** The source preference data access object */
private GeoMagSourcePreferenceDao sourcePrefDao = new GeoMagSourcePreferenceDao();
private GeoMagAvgDao avgDao = new GeoMagAvgDao();
private GeoMagK3hrDao k3hrDao = new GeoMagK3hrDao();
private GeoMagK1minDao k1minDao = new GeoMagK1minDao();
public GeoMagDao(String pluginName) throws PluginException {
super(pluginName);
}
// @Override
// public StorageStatus persistToHDF5(PluginDataObject... records)
// throws PluginException {
// long t0 = System.currentTimeMillis();
//
// // NOTE: currently making the assumption that models aren't
// // mixed in the records aggregate. If this isn't true,
// // some pre-processing will be needed.
// Map<PointDataContainer, List<PointDataView>> containerMap = new HashMap<PointDataContainer, List<PointDataView>>(
// records.length);
// Map<PointDataContainer, File> fileMap = new HashMap<PointDataContainer, File>();
//
// for (PluginDataObject p : records) {
// if (p instanceof IPointData) {
// PointDataView pdv = ((IPointData) p).getPointDataView();
// List<PointDataView> views = containerMap
// .get(pdv.getContainer());
// if (views == null) {
// views = new ArrayList<PointDataView>();
// containerMap.put(pdv.getContainer(), views);
// }
// views.add(pdv);
// File file = fileMap.get(pdv.getContainer());
// if (file == null) {
// file = getFullFilePath(p);
// System.out.println("***file " +file.toString());
// fileMap.put(pdv.getContainer(), file);
// }
//
// }DataTime
// }
//
// List<StorageStatus> ssList = new ArrayList<StorageStatus>();
// try {
// for (PointDataContainer container : containerMap.keySet()) {
// IDataStore ds = DataStoreFactory.getDataStore(fileMap
// .get(container));
// StorageProperties sp = new StorageProperties();
// String compression = PluginRegistry.getInstance()
// .getRegisteredObject(pluginName).getCompression();
// if (compression != null) {
// sp.setCompression(StorageProperties.Compression
// .valueOf(compression));
// }
//
// Set<String> params = container.getParameters();
// for (String param : params) {
// try {
// IDataRecord idr = container.getParameterRecord(param);
// ds.addDataRecord(idr, sp);
// } catch (StorageException e) {
// throw new PluginException("Error adding record", e);
// }
// }
//
// try {
// StorageStatus ss = ds.store(StoreOp.APPEND);
// if (ss.getOperationPerformed() == StoreOp.APPEND) {
// // increment the indices
// List<PointDataView> views = containerMap.get(container);
// int idx = (int) ss.getIndexOfAppend()[0];
// container.incrementIds(idx, views);
// }
// ssList.add(ss);
// } catch (StorageException e) {
// throw new PluginException("Error updating point file", e);
// }
// }
// // Aggregate the storage status errors
// StorageStatus aggregatedStatus = new StorageStatus();
// List<StorageException> se = new ArrayList<StorageException>();
// for (StorageStatus ss : ssList) {
// StorageException[] seArr = ss.getExceptions();
// if (seArr != null) {
// se.addAll(Arrays.asList(seArr));
// }
// }
//
// aggregatedStatus.setExceptions(se.toArray(new StorageException[se
// .size()]));
// return aggregatedStatus;
// }
//
// finally {
// System.out.println("Time spent in persist: "
// + (System.currentTimeMillis() - t0));
// }
// }
//
// public File getFullFilePath(PluginDataObject p) {
// File file;
// String directory = p.getPluginName() + File.separator
// + pathProvider.getHDFPath(p.getPluginName(), (IPersistable) p);
// file = new File(directory
// + File.separator
// + pathProvider.getHDFFileName(p.getPluginName(),
// (IPersistable) p));
// return file;
// }
/**
* Retrieves an geomag report using the datauri .
*
* @param dataURI
* The dataURI to match against.
* @return The report record if it exists.
*/
public GeoMagRecord queryByDataURI(String dataURI) {
GeoMagRecord report = null;
List<?> obs = null;
try {
obs = queryBySingleCriteria("dataURI", dataURI);
} catch (DataAccessLayerException e) {
e.printStackTrace();
}
if ((obs != null) && (obs.size() > 0)) {
report = (GeoMagRecord) obs.get(0);
}
return report;
}
/**
* Queries for to determine if a given data uri exists on the sfcobs table.
*
* @param dataUri
* The DataURI to find.
* @return An array of objects. If not null, there should only be a single
* element.
*/
public Object[] queryDataUriColumn(final String dataUri) {
String sql = "select datauri from awips.geomag where datauri='"
+ dataUri + "';";
Object[] results = executeSQLQuery(sql);
return results;
}
@Override
protected IDataStore populateDataStore(IDataStore dataStore, IPersistable record)
public IDataStore populateDataStore(IDataStore dataStore, IPersistable record)
throws StorageException {
//return null;
GeoMagRecord magRecord = (GeoMagRecord) record;
// change to 00:00:00.0. "/geomag/2013-04-01_00:00:00.0/BOU/102/GEOMAG";
// String headUri = magRecord.getDataURI();
// headUri = headUri.substring(0, 18) +"_00:00:00.0/" + headUri.substring(30);
/*
* Write observation times to HDF5.
*/
if (magRecord.getObsTimes() != null ) {
AbstractStorageRecord storageRecord = new LongDataRecord(GeoMagRecord.OBS_TIME,
magRecord.getDataURI(), (long[]) magRecord.getObsTimes(), 1,
new long[] {magRecord.getObsTimes().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
// if (magRecord.getObsTimes() != null ) {
// AbstractStorageRecord storageRecord = new LongDataRecord(GeoMagRecord.OBS_TIME,
// headUri, (long[]) magRecord.getObsTimes(), 1,
// new long[] {magRecord.getObsTimes().length});
// storageRecord.setCorrelationObject(magRecord);
// dataStore.addDataRecord(storageRecord);
//
// }
// if (magRecord.getCompIdx() != null) {
// AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.CompIdx,
// magRecord.getDataURI(), (int[]) magRecord.getCompIdx(), 1,
// new long[] {magRecord.getCompIdx().length});
//
// storageRecord.setCorrelationObject(record);
// dataStore.addDataRecord(storageRecord);
// }
/*
* Write component1 data to HDF5.
@ -66,6 +223,7 @@ public class GeoMagDao extends PluginDao {
new long[] {magRecord.getComp1Data().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
//StorageStatus ss = dataStore.store(StoreOp.APPEND);
}
/*
@ -77,67 +235,377 @@ public class GeoMagDao extends PluginDao {
new long[] {magRecord.getComp2Data().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
// /*
// * Write component3 data to HDF5.
// */
// if ( magRecord.getComp3Data() != null ) {
// AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.component3,
// magRecord.getDataURI(), (float[]) magRecord.getComp3Data(), 1,
// new long[] {magRecord.getComp3Data().length});
// storageRecord.setCorrelationObject(magRecord);
// dataStore.addDataRecord(storageRecord);
//
// }
//
// /*
// * Write component4 data to HDF5.
// */
// if ( magRecord.getComp4Data() != null ) {
// AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.component4,
// magRecord.getDataURI(), (float[]) magRecord.getComp4Data(), 1,
// new long[] {magRecord.getComp4Data().length});
// storageRecord.setCorrelationObject(magRecord);
// dataStore.addDataRecord(storageRecord);
//
// }
// if (magRecord.getHrAvgIdx() != null) {
// AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.HrAvgIdx,
// magRecord.getDataURI(), (int[]) magRecord.getHrAvgIdx(), 1,
// new long[] {magRecord.getHrAvgIdx().length});
//
// storageRecord.setCorrelationObject(record);
// dataStore.addDataRecord(storageRecord);
// }
/*
* Write H_HR_AVG data to HDF5.
*/
if ( magRecord.getHrAvgH() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.H_HR_AVG,
magRecord.getDataURI(), (float[]) magRecord.getHrAvgH(), 1,
new long[] {magRecord.getHrAvgH().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
/*
* Write component3 data to HDF5.
* Write D_HR_AVG data to HDF5.
*/
if ( magRecord.getComp3Data() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.component3,
magRecord.getDataURI(), (float[]) magRecord.getComp3Data(), 1,
new long[] {magRecord.getComp3Data().length});
if ( magRecord.getHrAvgD() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.D_HR_AVG,
magRecord.getDataURI(), (float[]) magRecord.getHrAvgD(), 1,
new long[] {magRecord.getHrAvgD().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
// /*
// * Write insertTime data to HDF5.
// */
// if ( magRecord.getCompInsertTime() != null ) {
// AbstractStorageRecord storageRecord = new LongDataRecord(GeoMagRecord.Comp_Insert_Time,
// magRecord.getDataURI(), (long[]) magRecord.getCompInsertTime(), 1,
// new long[] {magRecord.getCompInsertTime().length});
// storageRecord.setCorrelationObject(magRecord);
// dataStore.addDataRecord(storageRecord);
//
// }
/*
* Write component4 data to HDF5.
* Write K_Index data to HDF5.
*/
if ( magRecord.getComp4Data() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.component4,
magRecord.getDataURI(), (float[]) magRecord.getComp4Data(), 1,
new long[] {magRecord.getComp4Data().length});
// 3hr
if ( magRecord.getKKIndex() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.K_Index,
magRecord.getDataURI(), (int[]) magRecord.getKKIndex(), 1,
new long[] {magRecord.getKKIndex().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKKGamma() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.K_Gamma,
magRecord.getDataURI(), (float[]) magRecord.getKKGamma(), 1,
new long[] {magRecord.getKKGamma().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKKReal() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.K_Real,
magRecord.getDataURI(), (float[]) magRecord.getKKReal(), 1,
new long[] {magRecord.getKKReal().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKestIndex() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.Kest_Index,
magRecord.getDataURI(), (int[]) magRecord.getKestIndex(), 1,
new long[] {magRecord.getKestIndex().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKestGamma() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.Kest_Gamma,
magRecord.getDataURI(), (float[]) magRecord.getKestGamma(), 1,
new long[] {magRecord.getKestGamma().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKestReal() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.Kest_Real,
magRecord.getDataURI(), (float[]) magRecord.getKestReal(), 1,
new long[] {magRecord.getKestReal().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHKGamma() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KH_Gamma,
magRecord.getDataURI(), (float[]) magRecord.getHKGamma(), 1,
new long[] {magRecord.getHKGamma().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHKReal() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KH_Real,
magRecord.getDataURI(), (float[]) magRecord.getHKReal(), 1,
new long[] {magRecord.getHKReal().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDKGamma() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KD_Gamma,
magRecord.getDataURI(), (float[]) magRecord.getDKGamma(), 1,
new long[] {magRecord.getDKGamma().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDKReal() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KD_Real,
magRecord.getDataURI(), (float[]) magRecord.getDKReal(), 1,
new long[] {magRecord.getDKReal().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
// 1 min
// if (magRecord.getKIdx() != null) {
// AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.KIdx,
// magRecord.getDataURI(), (int[]) magRecord.getKIdx(), 1,
// new long[] {magRecord.getKIdx().length});
//
// storageRecord.setCorrelationObject(record);
// dataStore.addDataRecord(storageRecord);
// }
if ( magRecord.getKestIndex1m() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.Kest_Index_1m,
magRecord.getDataURI(), (int[]) magRecord.getKestIndex1m(), 1,
new long[] {magRecord.getKestIndex1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKestGamma1m() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.Kest_Gamma_1m,
magRecord.getDataURI(), (float[]) magRecord.getKestGamma1m(), 1,
new long[] {magRecord.getKestGamma1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getKestReal1m() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.Kest_Real_1m,
magRecord.getDataURI(), (float[]) magRecord.getKestReal1m(), 1,
new long[] {magRecord.getKestReal1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHKGamma1m() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KH_Gamma_1m,
magRecord.getDataURI(), (float[]) magRecord.getHKGamma1m(), 1,
new long[] {magRecord.getHKGamma1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHKReal1m() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KH_Real_1m,
magRecord.getDataURI(), (float[]) magRecord.getHKReal1m(), 1,
new long[] {magRecord.getHKReal1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDKGamma1m() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KD_Gamma_1m,
magRecord.getDataURI(), (float[]) magRecord.getDKGamma1m(), 1,
new long[] {magRecord.getDKGamma1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDKReal1m() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KD_Real_1m,
magRecord.getDataURI(), (float[]) magRecord.getDKReal1m(), 1,
new long[] {magRecord.getDKReal1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHKIndex1m() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.KH_Index_1m,
magRecord.getDataURI(), (int[]) magRecord.getHKIndex1m(), 1,
new long[] {magRecord.getHKIndex1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDKIndex1m() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.KD_Index_1m,
magRecord.getDataURI(), (int[]) magRecord.getDKIndex1m(), 1,
new long[] {magRecord.getDKIndex1m().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHCount() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.KH_Count,
magRecord.getDataURI(), (int[]) magRecord.getHCount(), 1,
new long[] {magRecord.getHCount().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDCount() != null ) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.KD_Count,
magRecord.getDataURI(), (int[]) magRecord.getDCount(), 1,
new long[] {magRecord.getDCount().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getHDev() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KH_Dev,
magRecord.getDataURI(), (float[]) magRecord.getHDev(), 1,
new long[] {magRecord.getHDev().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if ( magRecord.getDDev() != null ) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.KD_Dev,
magRecord.getDataURI(), (float[]) magRecord.getDDev(), 1,
new long[] {magRecord.getDDev().length});
storageRecord.setCorrelationObject(magRecord);
dataStore.addDataRecord(storageRecord);
}
if (magRecord.getKs() != null) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.K_s,
magRecord.getDataURI(), (float[]) magRecord.getKs(), 1,
new long[] {magRecord.getKs().length});
storageRecord.setCorrelationObject(record);
dataStore.addDataRecord(storageRecord);
}
if (magRecord.getAest() != null) {
AbstractStorageRecord storageRecord = new IntegerDataRecord(GeoMagRecord.A_est,
magRecord.getDataURI(), (int[]) magRecord.getAest(), 1,
new long[] {magRecord.getAest().length});
storageRecord.setCorrelationObject(record);
dataStore.addDataRecord(storageRecord);
}
if (magRecord.getLastUpdate() != null) {
AbstractStorageRecord storageRecord = new FloatDataRecord(GeoMagRecord.Last_Update_1m,
magRecord.getDataURI(), (float[]) magRecord.getLastUpdate(), 1,
new long[] {magRecord.getLastUpdate().length});
storageRecord.setCorrelationObject(record);
dataStore.addDataRecord(storageRecord);
}
return dataStore;
}
/*
* Get GeoMagSource from source ID
* Get GeoMagAvg from ID
*/
public GeoMagSource getGeoMagSource(int sourceId) {
return sourceDao.queryById(sourceId);
public GeoMagAvg getGeoMagAvg(Date avgTime) {
return (GeoMagAvg) avgDao.queryById(avgTime);
}
public Integer getGeoMagSourceId(String sourceName) throws DataAccessLayerException {
return sourceDao.getSourceId(sourceName);
}
// public Integer getGeoMagSourceId(String sourceName) throws DataAccessLayerException {
// return avgDao.getSourceId(sourceName);
// }
public GeoMagSourceDao getGeoMagSource() {
return sourceDao;
public GeoMagAvgDao getGeoMagAvgDao() {
return avgDao;
}
public void setGeoMagSourceDao(
GeoMagSourceDao sourceDao) {
this.sourceDao = sourceDao;
public void setGeoMagAvgDao(
GeoMagAvgDao avgDao) {
this.avgDao = avgDao;
}
/*
* Get GeoMagSourcePreference from source preference ID
* Get GeoMagK1min from ID
*/
public GeoMagSourcePreference getGeoMagSourcePreference(int prefId) {
return sourcePrefDao.queryById(prefId);
public GeoMagK1min getGeoMagDateK1min(int id) {
return k1minDao.queryById(id);
}
public GeoMagSourcePreferenceDao getGeoMagSourcePreference() {
return sourcePrefDao;
public GeoMagK1minDao getGeoMagK1minDao() {
return k1minDao;
}
public void setGeoMagK1minDao(
GeoMagK1minDao k1minDao) {
this.k1minDao = k1minDao;
}
public void setGeoMagSourcePreference(
GeoMagSourcePreferenceDao sourcePrefDao) {
this.sourcePrefDao = sourcePrefDao;
/*
* Get GeoMagK1min from ID
*/
public GeoMagK3hr getGeoMagDateK3hr(int id) {
return k3hrDao.queryById(id);
}
public GeoMagK3hrDao getGeoMagK3hrDao() {
return k3hrDao;
}
public void setGeoMagK3hrDao(
GeoMagK3hrDao k3hrDao) {
this.k3hrDao = k3hrDao;
}
}

View file

@ -0,0 +1,45 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.dao;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagK1min;
import com.raytheon.uf.edex.database.dao.CoreDao;
import com.raytheon.uf.edex.database.dao.DaoConfig;
/**
* Record implementation for geomag k1minDao.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ---------------- --------------------------
* 08/14/2013 T989 qzhou Initial creation.
* </pre>
*
* @author qzhou
* @version 1.0
*/
public class GeoMagK1minDao extends CoreDao {
/**
* Creates a new GribModelDao
*/
public GeoMagK1minDao() {
super(DaoConfig.forClass(GeoMagK1min.class));
}
/**
* Retrieves a GeoMagAvgId based on the given id
*
* @param id
* The given ID number
* @return The GeoMagAvgId
*/
public GeoMagK1min queryById(int id) {
return (GeoMagK1min) super.queryById(id);
}
public int getAreaId (int id){
return queryById(id).getId();
}
}

View file

@ -0,0 +1,75 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.dao;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import gov.noaa.nws.ncep.common.dataplugin.geomag.GeoMagK3hr;
import com.raytheon.uf.edex.database.dao.CoreDao;
import com.raytheon.uf.edex.database.dao.DaoConfig;
/**
* Record implementation for geomag k3hrDao.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ---------------- --------------------------
* 08/14/2013 T989 qzhou Initial creation.
* </pre>
*
* @author qzhou
* @version 1.0
*/
public class GeoMagK3hrDao extends CoreDao {
/**
* Creates a new GribModelDao
*/
public GeoMagK3hrDao() {
super(DaoConfig.forClass(GeoMagK3hr.class));
}
/**
* Retrieves a GeoMagAvgId based on the given id
*
* @param id
* The given ID number
* @return The GeoMagAvgId
*/
public GeoMagK3hr queryById(int id) {
return (GeoMagK3hr) super.queryById(id);
}
public int getId (int id){
return queryById(id).getId();
}
@SuppressWarnings("unchecked")
public List<GeoMagK3hr> getK3hrForStation(final String stationCode, final Date time) {
return (List<GeoMagK3hr>) txTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
HibernateTemplate ht = getHibernateTemplate();
Session sess = ht.getSessionFactory().getCurrentSession();
Criteria crit = sess.createCriteria(GeoMagK3hr.class);
Criterion where1 = Restrictions.eq("stationCode", stationCode);
crit.add(where1);
Criterion where2 = Restrictions.ge("k3hrTime", time);
crit.add(where2);
return crit.list();
}
});
}
}

View file

@ -1,85 +0,0 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.dao;
/**
* This Data Access Object is used to interact with the database to get geomag source
* ID numbers and source names for a geomag data.
*
* <pre>
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/2013 975 S. Gurung Initial Creation
* </pre>
*
* @author sgurung
* @version 1.0
*/
import java.util.List;
import com.raytheon.uf.edex.database.DataAccessLayerException;
import com.raytheon.uf.edex.database.dao.CoreDao;
import com.raytheon.uf.edex.database.dao.DaoConfig;
import com.raytheon.uf.edex.database.query.DatabaseQuery;
import gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSource;
public class GeoMagSourceDao extends CoreDao {
/**
* Constructs a new GeoMagSourceDao
*/
public GeoMagSourceDao() {
super(DaoConfig.forClass(GeoMagSource.class));
}
/**
* Retrieves a GeoMagSource based on the given source id
*
* @param sourceId
* The source ID number
* @return The GeoMagSource with the given ID
*/
public GeoMagSource queryById(int sourceId) {
return (GeoMagSource) super.queryById(sourceId);
}
/**
* Gets the source name given the id
*
* @param sourceId
* The source id
* @return The source name
* @throws DataAccessLayerException
* If errors occur during query
*/
@SuppressWarnings("unchecked")
public String getSourceName (int sourceId){
return queryById(sourceId).getSourceName();
}
/**
* Gets the source id given the name
*
* @param sourceName
* The source name
* @return The source id corresponding to the given name
* @throws DataAccessLayerException
* If errors occur during query
*/
@SuppressWarnings("unchecked")
public Integer getSourceId(String sourceName)
throws DataAccessLayerException {
DatabaseQuery query = new DatabaseQuery(daoClass.getName());
query.addReturnedField("sourceId");
query.addQueryParam("sourceName", sourceName);
List<Integer> sources = (List<Integer>) this.queryByCriteria(query);
if (sources.isEmpty()) {
return null;
} else {
return sources.get(0);
}
}
}

View file

@ -1,49 +0,0 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.dao;
/**
* This Data Access Object is used to interact with the database to get geomag source preference
* ID numbers and source preference order for a geomag data.
*
* <pre>
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/2013 975 S. Gurung Initial Creation
* </pre>
*
* @author sgurung
* @version 1.0
*/
import com.raytheon.uf.edex.database.dao.CoreDao;
import com.raytheon.uf.edex.database.dao.DaoConfig;
import gov.noaa.nws.ncep.common.dataplugin.geomag.fixed.GeoMagSourcePreference;
public class GeoMagSourcePreferenceDao extends CoreDao {
/**
* Constructs a new GeoMagSourcePreferenceDao
*/
public GeoMagSourcePreferenceDao() {
super(DaoConfig.forClass(GeoMagSourcePreference.class));
}
/**
* Retrieves a GeoMag source preference based on the given source preference id
*
* @param preferenceId
* The source preference ID number
* @return The GeoMagSource
*/
public GeoMagSourcePreference queryById(int preferenceId) {
return (GeoMagSourcePreference) super.queryById(preferenceId);
}
public String getSourcePreferenceDesc (int preferenceId){
return queryById(preferenceId).getDescription();
}
}

View file

@ -1,112 +0,0 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.fixed;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
import com.raytheon.uf.common.serialization.ISerializableObject;
/**
* This java class is to create GEOMAG sources.
*
* <pre>
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/2013 975 S. Gurung Initial Creation
*
* </pre>
*
* @author sgurung
* @version 1.0
*/
@Entity
@Table(name = "geomag_sources", uniqueConstraints=@javax.persistence.UniqueConstraint(columnNames="sourceName"))
public class GeoMagSource extends PersistableDataObject implements
Serializable, ISerializableObject {
private static final long serialVersionUID = 1L;
/** The source id number */
@Id
private int sourceId;
/** The source preference id number */
@Column(length = 16)
private int preferenceId;
/** The source description */
@Column(length = 128)
private String sourceDesc;
/** The source name */
@Column(length = 64)
private String sourceName;
/**
* Constructs and empty GeoMagSource
*/
public GeoMagSource() {
}
/**
* Constructs a new GeoMagSource
*
* @param sourceId
* The source ID number
* @param sourceName
* The source name
* @param preferenceId
* The preference ID number
* @param sourceDesc
* The source description
*/
public GeoMagSource (int sourceId, int preferenceId, String sourceName, String sourceDesc) {
this.sourceId = sourceId;
this.preferenceId = preferenceId;
this.sourceName = sourceName;
this.sourceDesc = sourceDesc;
}
public int getSourceId() {
return sourceId;
}
public void setSourceId(int sourceId) {
this.sourceId = sourceId;
}
public String getSourceName() {
return sourceName;
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public int getPreferenceId() {
return preferenceId;
}
public void setPreferenceId(int preferenceId) {
this.preferenceId = preferenceId;
}
public String getSourceDesc() {
return sourceDesc;
}
public void setSourceDesc(String sourceDesc) {
this.sourceDesc = sourceDesc;
}
public String toString() {
return sourceName;
}
}

View file

@ -1,94 +0,0 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.fixed;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
import com.raytheon.uf.common.serialization.ISerializableObject;
/**
* This java class is to create GEOMAG source preferences.
*
* <pre>
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/2013 975 S. Gurung Initial Creation
*
* </pre>
*
* @author sgurung
* @version 1.0
*/
@Entity
@Table(name = "geomag_source_preferences")
public class GeoMagSourcePreference extends PersistableDataObject implements
Serializable, ISerializableObject {
private static final long serialVersionUID = 1L;
/** The source id number */
@Id
private int preferenceId;
/** The source name */
@Column(length = 128)
private String description;
/** The preference order number */
@Column(length = 128)
private int preferenceOrder;
/**
* Constructs and empty GeoMagSourcePreference
*/
public GeoMagSourcePreference() {
}
/**
* Constructs a new GeoMagSourcePreference
*
* @param preferenceId
* The area file ID number
* @param description
* The area name
*/
public GeoMagSourcePreference (int sourceId, String sourceName) {
this.preferenceId = sourceId;
this.description = sourceName;
}
public int getSourceId() {
return preferenceId;
}
public void setSourceId(int sourceId) {
this.preferenceId = sourceId;
}
public String getDescription() {
return description;
}
public void setDescription(String desc) {
this.description = desc;
}
public int getPreferenceOrder() {
return preferenceOrder;
}
public void setPreferenceOrder(int preferenceOrder) {
this.preferenceOrder = preferenceOrder;
}
public String toString() {
return description;
}
}

View file

@ -0,0 +1,51 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* Defines a magnetometer station.
*
*<pre>
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 07/17/2013 975 qzhou Initiate for reading source attributes
* </pre>
*
* @author qzhou
* @version 1
*/
@XmlRootElement(name = "source")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "")
public class GeoMagSource {
@XmlAttribute
private String name;
@XmlAttribute
private int priority;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
}

View file

@ -4,9 +4,7 @@ import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@ -21,6 +19,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 03/29/2013 975 sgurung Initial Creation
* 07/17/2013 975 qzhou Changed source type for reading source attributes
* </pre>
*
* @author sgurung
@ -48,8 +47,7 @@ public class GeoMagStation {
* Data sources for the station
*/
@XmlElement
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
protected String[] source;
protected ArrayList<GeoMagSource> source;
/**
* Indicates whether the station should be included
@ -65,6 +63,13 @@ public class GeoMagStation {
@XmlElement
protected Boolean kpStation;
/**
* Indicates whether the station has a header.
* Same station data may have or have no header.
*/
@XmlElement
protected String hasHeader;
/**
* Data order (e.g. HDZF or XYZF)
*/
@ -84,8 +89,10 @@ public class GeoMagStation {
@XmlElement
protected RawDataFormat rawDataFormat;
public GeoMagStation() {
public GeoMagStation() {
source = new ArrayList<GeoMagSource>();
}
/**
@ -124,7 +131,7 @@ public class GeoMagStation {
* Gets the stationCode of this station
* @return the stationCode
*/
public String[] getSource() {
public ArrayList<GeoMagSource> getSource() {
return source;
}
@ -132,7 +139,7 @@ public class GeoMagStation {
* Sets the source of this station
* @param source the source to set
*/
public void setSource(String[] source) {
public void setSource(ArrayList<GeoMagSource> source) {
this.source = source;
}
@ -170,6 +177,22 @@ public class GeoMagStation {
this.kpStation = kpStation;
}
/**
* Gets the header true or false
* @return the hasHeader
*/
public String getHasHeader() {
return hasHeader;
}
/**
* Sets the hasHeader value of this station
* @param hasHeader the hasHeader to set
*/
public void setHasHeader(String hasHeader) {
this.hasHeader = hasHeader;
}
/**
* Gets the dataOrder of this station
* @return the dataOrder
@ -217,4 +240,5 @@ public class GeoMagStation {
public void setRawDataFormat(RawDataFormat rawDataFormat) {
this.rawDataFormat = rawDataFormat;
}
}

View file

@ -0,0 +1,74 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/*
* The FitTime.
*
* <pre>
* SOFTWARE HISTORY
*
* ate Ticket# Engineer Description
* ----------- ---------- ---------- --------------------------
* 05/14/2013 #989 qzhou Initial Creation
* </pre>
*
* @author qzhou
* @version 1
*/
@XmlRootElement(name = "fitTime")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "")
public class KFitTime {
@XmlAttribute
private String key;
@XmlAttribute
private float coeffA;
@XmlAttribute
private float coeffB;
@XmlAttribute
private float coeffW;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public float getCoeffA() {
return coeffA;
}
public void setCoeffA(float coeffA) {
this.coeffA = coeffA;
}
public float getCoeffB() {
return coeffB;
}
public void setCoeffB(float coeffB) {
this.coeffB = coeffB;
}
public float getCoeffW() {
return coeffW;
}
public void setCoeffW(float coeffW) {
this.coeffW = coeffW;
}
}

View file

@ -0,0 +1,61 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.table;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
/*
* The KStationCoeffTable Reader.
*
* <pre>
* SOFTWARE HISTORY
*
* ate Ticket# Engineer Description
* ----------- ---------- ---------- --------------------------
* 05/14/2013 #989 qzhou Initial Creation
* </pre>
*
* @author qzhou
* @version 1
*/
public class KStationCoeffTableReader {
private String xmlFile = null;
public KStationCoeffTableReader(String file) {
xmlFile = file;
}
public List<KStationCoefficient> getStationList() throws JAXBException{
JAXBContext context = JAXBContext.newInstance(KStationCoefficients.class);
//PACKAGE);
Unmarshaller unmarshaller = context.createUnmarshaller();
KStationCoefficients sfstnlist = null;
File file = new File(xmlFile);
try {
if (file.exists()) {
sfstnlist = (KStationCoefficients)unmarshaller.unmarshal(
new FileReader(xmlFile));
List<KStationCoefficient> listOfItems = sfstnlist.getKStationCoefficients();
return listOfItems;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
}

View file

@ -0,0 +1,151 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.table;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/*
* The KStationCoefficient.
*
* <pre>
* SOFTWARE HISTORY
*
* ate Ticket# Engineer Description
* ----------- ---------- ---------- --------------------------
* 05/14/2013 #989 qzhou Initial Creation
* </pre>
*
* @author qzhou
* @version 1
*/
@XmlRootElement(name = "kStationCoefficient")
@XmlAccessorType(XmlAccessType.NONE)
//@XmlType(name = "")
public class KStationCoefficient {
/**
* Station Code
*/
@XmlElement
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String stationCode;
/**
* provider
*/
@XmlElement
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String provider;
/**
* k9Limit
*/
@XmlElement
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String k9Limit;
/**
* longitude
*/
@XmlElement
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String longitude;
/**
* fitTime
*/
@XmlElement
protected ArrayList<KFitTime> fitTime;
/**
* @XmlElement
*/
@XmlElement
protected ArrayList<KsThree> ksThree;
/**
* Default constructor.
*/
public KStationCoefficient() {
fitTime = new ArrayList<KFitTime>();
ksThree = new ArrayList<KsThree>();
}
/**
* @return the stationCode
*/
public String getStationCode() {
return stationCode;
}
/**
* @param stationCode: the stationCode to set
*/
public void setStationCode(String stationCode) {
this.stationCode = stationCode;
}
/**
* @return the provider
*/
public String getProvider() {
return provider;
}
/**
* @param provider: the provider to set
*/
public void setProvider(String provider) {
this.provider = provider;
}
/**
* @return the k9Limit
*/
public String getK9Limit() {
return k9Limit;
}
/**
* @param k9Limit: the k9Limit to set
*/
public void setK9Limit(String k9Limit) {
this.k9Limit = k9Limit;
}
/**
* @return the longitude
*/
public String getLongitude() {
return longitude;
}
/**
* @param longitude: the longitude to set
*/
public void setLongitude(String longitude) {
this.longitude = longitude;
}
/**
* @return the fitTime
*/
public ArrayList<KFitTime> getKFitTime() {
return fitTime;
}
/**
* @return the fitTime
*/
public ArrayList<KsThree> getKsThree() {
return ksThree;
}
public void setKsThree(ArrayList<KsThree> ksThree) {
this.ksThree = ksThree;
}
}

View file

@ -0,0 +1,98 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.table;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.serialization.ISerializableObject;
/*
* The KStationCoefficients.
*
* <pre>
* SOFTWARE HISTORY
*
* ate Ticket# Engineer Description
* ----------- ---------- ---------- --------------------------
* 05/14/2013 #989 qzhou Initial Creation
* </pre>
*
* @author qzhou
* @version 1
*/
@XmlRootElement(name = "kStationCoefficients")
@XmlAccessorType(XmlAccessType.NONE)
public class KStationCoefficients implements ISerializableObject{
/**
* A list of the available KStationCoefficients
*/
@XmlElement(name="kStationCoefficient")
private ArrayList<KStationCoefficient> stationList;
/**
* Default constructor.
*/
public KStationCoefficients() {
stationList = new ArrayList<KStationCoefficient>();
}
/**
* Gets the list of KStationCoefficients
* @return the stationList
*/
public ArrayList<KStationCoefficient> getKStationCoefficients() {
return stationList;
}
/**
*
* @param file
* @return
* @throws JAXBException
*/
public static KStationCoefficients fromFile(File file) throws JAXBException {
KStationCoefficients gml = null;
JAXBContext ctx = JAXBContext.newInstance(KStationCoefficients.class);
if (ctx != null) {
Unmarshaller um = ctx.createUnmarshaller();
if (um != null) {
gml = (KStationCoefficients) um.unmarshal(file);
}
}
//System.out.println("*****fromFile"+gml.getK9Limit());
return gml;
}
/**
*
* @param is
* @return
* @throws JAXBException
*/
public static KStationCoefficients fromStream(InputStream is)
throws JAXBException {
KStationCoefficients gml = null;
JAXBContext ctx = JAXBContext.newInstance(KStationCoefficients.class);
if (ctx != null) {
Unmarshaller um = ctx.createUnmarshaller();
if (um != null) {
gml = (KStationCoefficients) um.unmarshal(is);
}
}
return gml;
}
}

View file

@ -0,0 +1,148 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.table;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/*
* The KStationCoeffTable Reader.
*
* <pre>
* SOFTWARE HISTORY
*
* ate Ticket# Engineer Description
* ----------- ---------- ---------- --------------------------
* 05/14/2013 #989 qzhou Initial Creation
* </pre>
*
* @author qzhou
* @version 1
*/
@XmlRootElement(name = "ksThree")
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "")
public class KsThree {
@XmlAttribute
private String period;
@XmlAttribute
private String season;
@XmlAttribute
private int k0;
@XmlAttribute
private int k1;
@XmlAttribute
private int k2;
@XmlAttribute
private int k3;
@XmlAttribute
private int k4;
@XmlAttribute
private int k5;
@XmlAttribute
private int k6;
@XmlAttribute
private int k7;
@XmlAttribute
private int k8;
@XmlAttribute
private int k9;
public String getSeason() {
return season;
}
public void setSeason(String season) {
this.season = season;
}
public String getPeriod() {
return period;
}
public void setPeriod(String period) {
this.period = period;
}
public int getK0() {
return k0;
}
public void setK0(int k0) {
this.k0 = k0;
}
public int getK1() {
return k1;
}
public void setK1(int k1) {
this.k1 = k1;
}
public int getK2() {
return k2;
}
public void setK2(int k2) {
this.k2 = k2;
}
public int getK3() {
return k3;
}
public void setK3(int k3) {
this.k3 = k3;
}
public int getK4() {
return k4;
}
public void setK4(int k4) {
this.k4 = k4;
}
public int getK5() {
return k5;
}
public void setK5(int k5) {
this.k5 = k5;
}
public int getK6() {
return k6;
}
public void setK6(int k6) {
this.k6 = k6;
}
public int getK7() {
return k7;
}
public void setK7(int k7) {
this.k7 = k7;
}
public int getK8() {
return k8;
}
public void setK8(int k8) {
this.k8 = k8;
}
public int getK9() {
return k9;
}
public void setK9(int k9) {
this.k9 = k9;
}
}

View file

@ -27,7 +27,7 @@ import com.raytheon.uf.common.localization.PathManagerFactory;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/2013 975 sgurung Initial creation
*
* 07/2013 975 qzhou Change Map<String, GeoMagStation> stnsByCode to
* </pre>
*
* @author sgurung
@ -43,11 +43,10 @@ public class GeoMagStationLookup {
private static GeoMagStationLookup instance;
/** A map of the stations. The key is the station code of the station */
private Map<String, GeoMagStation> stnsByCode;
private Map<String, ArrayList<GeoMagStation>> stnsByCode;
public static synchronized GeoMagStationLookup getInstance() {
if (instance == null) {
// System.out.println("in reloading geoMagStations.xml ....");
instance = new GeoMagStationLookup();
}
return instance;
@ -64,7 +63,7 @@ public class GeoMagStationLookup {
}
private GeoMagStationLookup() {
stnsByCode = new HashMap<String, GeoMagStation>();
stnsByCode = new HashMap<String, ArrayList<GeoMagStation>>();
try {
initStationList();
} catch (GeoMagException e) {
@ -72,11 +71,26 @@ public class GeoMagStationLookup {
}
}
public GeoMagStation getStationByCode(String stnCode) {
return stnsByCode.get(stnCode);
public GeoMagStation getStationByCode(String stnCode, boolean hasHeader) {
ArrayList<GeoMagStation> stationList = null;
stationList = stnsByCode.get(stnCode);
int i = 0;
for (i = 0; i <stationList.size(); i++) {
if (hasHeader == true && stationList.get(i).getRawDataFormat().getHeaderFormat() != null)
break;
else if (hasHeader == false && stationList.get(i).getRawDataFormat().getHeaderFormat() == null)
break;
else if (hasHeader == true && stationList.get(i).getRawDataFormat().getHeaderFormat() == null)
break;
}
public Map<String, GeoMagStation> getStationsByCodeMap() {
return stationList.get(i);
}
public Map<String, ArrayList<GeoMagStation>> getStationsByCodeMap() {
return stnsByCode;
}
@ -110,15 +124,28 @@ public class GeoMagStationLookup {
if (stnsFile.exists()) {
geoMagStationsTbl = new GeoMagStationTableReader(stnsFile.getPath());
}
// if site version exists, use it instead
/*if (siteStnsFile.exists()) {
geoMagStationsTbl = new GeoMagStationTableReader(stnsFile.getPath());
}*/
List<GeoMagStation> list = (geoMagStationsTbl!=null)?geoMagStationsTbl.getStationList():new ArrayList<GeoMagStation>();
//System.out.println("**list "+list.size());
for(GeoMagStation station : list){
stnsByCode.put(station.getStationCode(), station);
ArrayList<GeoMagStation> stationList = null;
if (stnsByCode.containsKey(station.getStationCode())) {
stationList = stnsByCode.get(station.getStationCode());
if(stationList==null)
stationList=new ArrayList<GeoMagStation>();
stationList.add(station);
}else{
stationList=new ArrayList<GeoMagStation>();
stationList.add(station);
}
stnsByCode.put(station.getStationCode(), stationList);//station);
}
} catch (Exception e) {
throw new GeoMagException("Unable to unmarshal ncep geomag stations file");

View file

@ -0,0 +1,132 @@
package gov.noaa.nws.ncep.common.dataplugin.geomag.util;
import gov.noaa.nws.ncep.common.dataplugin.geomag.exception.GeoMagException;
import gov.noaa.nws.ncep.common.dataplugin.geomag.table.KStationCoeffTableReader;
import gov.noaa.nws.ncep.common.dataplugin.geomag.table.KStationCoefficient;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.PathManagerFactory;
/*
* The KStationCoefficient table Lookup.
*
* <pre>
* SOFTWARE HISTORY
*
* ate Ticket# Engineer Description
* ----------- ---------- ---------- --------------------------
* 05/14/2013 #989 qzhou Initial Creation
* </pre>
*
* @author qzhou
* @version 1
*/
public class KStationCoefficientLookup {
/** The logger */
protected transient Log logger = LogFactory.getLog(getClass());
/** The singleton instance of GeoMagStationLookup **/
private static KStationCoefficientLookup instance;
/** A map of the stations. The key is the station code of the station */
private Map<String, KStationCoefficient> coeff;
public static synchronized KStationCoefficientLookup getInstance() {
if (instance == null) {
try {
instance = new KStationCoefficientLookup();
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return instance;
}
/**
* If file has been modified, then reload it again
*
* @return
* @return
*/
public static void ReloadInstance() {
instance = null;
}
private KStationCoefficientLookup() throws JAXBException {
coeff = new HashMap<String, KStationCoefficient>();
try {
initStationList();
} catch (GeoMagException e) {
logger.error("Unable to initialize K stations list!", e);
}
}
public KStationCoefficient getStationByCode(String stnCode) {
return coeff.get(stnCode);
}
public Map<String, KStationCoefficient> getStationsByCodeMap() {
return coeff;
}
private void initStationList() throws GeoMagException, JAXBException {
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext commonStaticBase = pathMgr.getContext(
LocalizationContext.LocalizationType.COMMON_STATIC,
LocalizationContext.LocalizationLevel.BASE);
/*LocalizationContext commonStaticSite = pathMgr.getContext(
LocalizationContext.LocalizationType.COMMON_STATIC,
LocalizationContext.LocalizationLevel.SITE);*/
String path = "";
//String sitePath = "";
try {
path = pathMgr.getFile(commonStaticBase,
"ncep" + File.separator + "geomag" + File.separator + "kStandardLookup.xml")
.getCanonicalPath();
//sitePath = pathMgr.getFile(commonStaticSite, NcPathConstants.GEOMAG_STNS_TBL).getCanonicalPath();
} catch (IOException e) {
logger.error("Error reading K stations coefficient table. ", e);
}
File stnsFile = new File(path);
//File siteStnsFile = new File(sitePath);
KStationCoeffTableReader kStationCoeffTbl = null;
if (stnsFile.exists()) {
kStationCoeffTbl = new KStationCoeffTableReader(stnsFile.getPath());
}
// if site version exists, use it instead
/*if (siteStnsFile.exists()) {
geoMagStationsTbl = new GeoMagStationTableReader(stnsFile.getPath());
}*/
List<KStationCoefficient> list = (kStationCoeffTbl!=null)? kStationCoeffTbl.getStationList() : new ArrayList<KStationCoefficient>();
for(KStationCoefficient station : list){
coeff.put(station.getStationCode(), station);
//System.out.println("****look2 "+station.getStationCode());
}
}
}

Some files were not shown because too many files have changed in this diff Show more