Merge branch 'omaha_14.2.2' (14.2.2-3) into development

Conflicts:
	cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPResource.java
	cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java
	cave/com.raytheon.viz.hydrobase/src/com/raytheon/viz/hydrobase/dialogs/QcAlertAlarmLimitsDlg.java
	cave/com.raytheon.viz.hydrocommon/src/com/raytheon/viz/hydrocommon/resource/HRAPOverlayResource.java
	cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/MPEDisplayManager.java
	cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/gui/WarngenLayer.java
	cave/com.raytheon.viz.warngen/src/com/raytheon/viz/warngen/template/TemplateRunner.java
	edexOsgi/com.raytheon.edex.textdb/src/com/raytheon/edex/textdb/dbapi/impl/TextDBStaticData.java
	edexOsgi/com.raytheon.edex.textdb/src/com/raytheon/edex/textdb/ingest/TextDBStaticDataSubscriber.java
	edexOsgi/com.raytheon.uf.common.dataplugin.grid/utility/common_static/base/styleRules/d2dContourStyleRules.xml
	edexOsgi/com.raytheon.uf.common.dataplugin.grid/utility/common_static/base/styleRules/gridImageryStyleRules.xml
	edexOsgi/com.raytheon.uf.edex.plugin.manualIngest/res/spring/manualIngest-spring.xml

Former-commit-id: 21ae3b5fcd [formerly 3575d6586f [formerly bd13bc332bcdd87723bec8669885f4594ad483b9]]
Former-commit-id: 3575d6586f
Former-commit-id: cd51f3fa87
This commit is contained in:
Richard Peter 2014-04-11 16:23:09 -05:00
commit 9b12d9ddaf
94 changed files with 2459 additions and 569 deletions

View file

@ -1,23 +1,8 @@
# productId elevAngle prodCategory Partial WMO Id
2 0 GSM NXUS6
19 5 N0R SDUS5
19 13 N1R SDUS2
19 15 N1R SDUS2
19 24 N2R SDUS2
19 25 N2R SDUS2
19 31 N3R SDUS3
19 34 N3R SDUS3
19 35 N3R SDUS3
20 5 N0Z SDUS7
25 5 N0W SDUS6
27 5 N0V SDUS5
27 13 N1V SDUS7
27 15 N1V SDUS7
27 24 N2V SDUS6
27 25 N2V SDUS6
27 31 N3V SDUS6
27 34 N3V SDUS6
27 35 N3V SDUS6
28 5 NSP SDUS6
30 5 NSW SDUS6
32 0 DHR SDUS5
@ -40,7 +25,7 @@
56 34 N3S SDUS3
56 35 N3S SDUS3
57 0 NVL SDUS5
58 0 NST SDUS6
58 0 NST SDUS3
59 0 NHI SDUS6
61 0 NTV SDUS6
62 0 NSS SDUS6
@ -50,7 +35,7 @@
75 0 FTM NOUS6
78 0 N1P SDUS3
80 0 NTP SDUS5
81 0 DPA SDUS8
81 0 DPA SDUS5
82 0 SPD SDUS6
90 0 NHL SDUS6
136 0 RWO SDUS9
@ -79,3 +64,61 @@
99 35 N3U SDUS2
134 0 DVL SDUS5
135 0 EET SDUS7
159 5 N0X SDUS8
159 9 NAX SDUS8
159 13 N1X SDUS8
159 15 N1X SDUS8
159 18 NBX SDUS8
159 24 N2X SDUS8
159 25 N2X SDUS8
159 31 N3X SDUS8
159 34 N3X SDUS8
159 35 N3X SDUS8
161 5 N0C SDUS8
161 9 NAC SDUS8
161 13 N1C SDUS8
161 15 N1C SDUS8
161 18 NBC SDUS8
161 24 N2C SDUS8
161 25 N2C SDUS8
161 31 N3C SDUS8
161 34 N3C SDUS8
161 35 N3C SDUS8
163 5 N0K SDUS8
163 9 NAK SDUS8
163 13 N1K SDUS8
163 15 N1K SDUS8
163 18 NBK SDUS8
163 24 N2K SDUS8
163 25 N2K SDUS8
163 31 N3K SDUS8
163 34 N3K SDUS8
163 35 N3K SDUS8
165 5 N0H SDUS8
165 9 NAH SDUS8
165 13 N1H SDUS8
165 15 N1H SDUS8
165 18 NBH SDUS8
165 24 N2H SDUS8
165 25 N2H SDUS8
165 31 N3H SDUS8
165 34 N3H SDUS8
165 35 N3H SDUS8
166 5 N0M SDUS8
166 9 NAM SDUS8
166 13 N1M SDUS8
166 15 N1M SDUS8
166 18 NBM SDUS8
166 24 N2M SDUS8
166 25 N2M SDUS8
166 31 N3M SDUS8
166 34 N3M SDUS8
166 35 N3M SDUS8
169 0 OHA SDUS8
170 0 DAA SDUS8
171 0 PTA SDUS3
172 0 DTA SDUS8
174 0 DOD SDUS8
175 0 DSD SDUS8
176 0 DPR SDUS8
177 0 HHC SDUS8

View file

@ -1,36 +1,46 @@
RPS List rps-RPGOP-tcp.clear-air modified 2007:01:03:00:00:00 ... 31 products
An RPS list contains the following fields: Product Name, Product
Mnemonic, Product Code, Number of Data Levels, Resolution, Layer Code,
Elevation, Contour Interval, Priority, Req Interval, and Map
The record format is: '%-39s %-3s%4d%4d%6d %c%6d%7d%2d%2d%c'
Reflectivity (Z) Z 19 16 100 - 5 -1 0 1N
Reflectivity (Z) Z 19 16 100 - 15 -1 0 1N
Reflectivity (Z) Z 19 16 100 - 25 -1 0 1N
Reflectivity (Z) Z 19 16 100 - 35 -1 0 1N
Reflectivity (Z) Z 20 16 200 - 5 -1 0 1N
Velocity (V) V 27 16 100 - 5 -1 0 1N
Velocity (V) V 27 16 100 - 15 -1 0 1N
Velocity (V) V 27 16 100 - 25 -1 0 1N
Velocity (V) V 27 16 100 - 35 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 5 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 15 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 25 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 35 -1 0 1N
Composite Ref (CZ) CZ 36 8 400 - -1 -1 0 1N
Composite Ref (CZ) CZ 37 16 100 - -1 -1 0 1N
Composite Ref (CZ) CZ 38 16 400 - -1 -1 0 1N
Lyr Comp Ref Max (LRM) Level 1 LRM 65 8 0 L -1 -1 0 1N
Lyr Comp Ref Max (LRM) Level 2 LRM 66 8 0 M -1 -1 0 1N
Lyr Comp Ref Max (LRM) Level 3 LRM 90 8 0 H -1 -1 0 1N
Lyr Comp Ref MAX (APR) APR 67 16 0 L -1 -1 0 1N
Echo Tops (ET) ET 41 16 0 - -1 -1 0 1N
Vert Integ Liq (VIL) VIL 57 16 0 - -1 -1 0 1N
One Hour Precip (OHP) OHP 78 16 0 - -1 -1 0 1N
Storm Total Precip (STP) STP 80 16 0 - -1 -1 0 1N
VAD Wind Profile (VWP) VWP 48 0 0 - -1 -1 0 1N
Digital Precip Array (DPA) DPA 81 256 400 - -1 -1 0 1N
Velocity (V) V 25 16 100 - 5 -1 0 1N
Base Spectrum Width (SW) SW 28 8 100 - 5 -1 0 1N
Base Spectrum Width (SW) SW 30 8 100 - 5 -1 0 1N
Digital Hybrid Scan Refl (DHR) DHR 32 256 100 - -1 -1 0 1N -1 -1
Storm Total Precip (STP) STP 138 256 200 - -1 -1 0 1N -1 -1 N
RPS List rps-RPGOP-tcp.VCP32.rps created 2010:11:18:17:32:56 ... 41 products
An RPS list contains the fields: Prod-Name, Mnemonic, Prod-Code
Number of Data Levels, Resolution, Layer Code, Elevation, Contour Interval,
Priority, Req Interval, Map, Lower Layer, Upper Layer, multCut, endHour, timeSpan
The record format is: '%-39s %-3s%4d%4d%6d %c%6d%7d%2d%2d%c%3d%3d %c%7d%7d'
Reflectivity (Z) Z 94 256 100 - 8227 -1 0 1N -1 -1 N -1 0
Velocity (V) V 99 256 25 - 8227 -1 0 1N -1 -1 N -1 0
Reflectivity (Z) Z 19 16 100 - 5 -1 0 1N -1 -1 N -1 0
Reflectivity (Z) Z 20 16 200 - 5 -1 0 1N -1 -1 N -1 0
Velocity (V) V 27 16 100 - 5 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 5 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 15 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 25 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 35 -1 0 1N -1 -1 N -1 0
Composite Ref (CZ) CZ 36 8 400 - -1 -1 0 1N 2 -1 N -1 0
Composite Ref (CZ) CZ 37 16 100 - -1 -1 0 1N 2 -1 N -1 0
Composite Ref (CZ) CZ 38 16 400 - -1 -1 0 1N 2 -1 N -1 0
Lyr Comp Ref Max (LRM) Level 1 LRM 65 8 0 L -1 -1 0 1N -1 -1 N -1 0
Lyr Comp Ref Max (LRM) Level 2 LRM 66 8 0 M -1 -1 0 1N -1 -1 N -1 0
Lyr Comp Ref Max (LRM) Level 3 LRM 90 8 0 H -1 -1 0 1N -1 -1 N -1 0
Lyr Comp Ref MAX (APR) APR 67 16 0 L -1 -1 0 1N -1 -1 N -1 0
Echo Tops (ET) ET 41 16 0 - -1 -1 0 1N 2 -1 N -1 0
Vert Integ Liq (VIL) VIL 57 16 0 - -1 -1 0 1N 2 -1 N -1 0
Enhanced Echo Tops (EET) EET 135 256 100 - -1 -1 0 1N -1 -1 N -1 0
Digital Vert Integ Liq (DVL) DVL 134 256 100 - -1 -1 0 1N -1 -1 N -1 0
One Hour Precip (OHP) OHP 78 16 0 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Precip (STP) STP 80 16 0 - -1 -1 0 1N -1 -1 N -1 0
VAD Wind Profile (VWP) VWP 48 0 0 - -1 -1 0 1N -1 -1 N -1 0
Digital Precip Array (DPA) DPA 81 256 400 - -1 -1 0 1N -1 -1 N -1 0
Base Spectrum Width (SW) SW 28 8 100 - 5 -1 0 1N -1 -1 N -1 0
Base Spectrum Width (SW) SW 30 8 100 - 5 -1 0 1N -1 -1 N -1 0
Digital Hybrid Scan Refl (DHR) DHR 32 256 100 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Precip (STP) STP 138 256 200 - -1 -1 0 1N -1 -1 N -1 0
Differential Refl (ZDR) ZDR 159 256 25 - 8227 -1 0 1N -1 -1 N -1 0
Correlation Coeff (CC) CC 161 256 25 - 8227 -1 0 1N -1 -1 N -1 0
Specific Diff Phase (KDP) KDP 163 256 25 - 8227 -1 0 1N -1 -1 N -1 0
Hydrometeor Class (HC) HC 165 256 25 - 8227 -1 0 1N -1 -1 N -1 0
Melting Layer (ML) ML 166 0 0 - 8227 -1 0 1N -1 -1 N -1 0
Digital Inst Precip Rate (DPR) DPR 176 0 25 - -1 -1 0 1N -1 -1 N -1 0
Hybrid Hydrometeor Class (HHC) HHC 177 256 25 - -1 -1 0 1N -1 -1 N -1 0
One Hour Accum (OHA) OHA 169 16 200 - -1 -1 0 1N -1 -1 N -1 0
One Hour Unbiased Accum (DAA) DAA 170 256 25 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Accum (STA) STA 171 16 200 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Accum (STA) STA 172 256 25 - -1 -1 0 1N -1 -1 N -1 0
One Hour Diff (DOD) DOD 174 256 25 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Diff (DSD) DSD 175 256 25 - -1 -1 0 1N -1 -1 N -1 0

View file

@ -1,43 +1,51 @@
RPS List rps-RPGOP-tcp.storm created 2007:01:03:00:00:00 ... 38 products
An RPS list contains the following fields: Product Name, Product
Mnemonic, Product Code, Number of Data Levels, Resolution, Layer Code,
Elevation, Contour Interval, Priority, Req Interval, and Map
The record format is: '%-39s %-3s%4d%4d%6d %c%6d%7d%2d%2d%c'
Reflectivity (Z) Z 19 16 100 - 5 -1 0 1N
Reflectivity (Z) Z 19 16 100 - 15 -1 0 1N
Reflectivity (Z) Z 19 16 100 - 25 -1 0 1N
Reflectivity (Z) Z 19 16 100 - 35 -1 0 1N
Reflectivity (Z) Z 20 16 200 - 5 -1 0 1N
Velocity (V) V 27 16 100 - 5 -1 0 1N
Velocity (V) V 27 16 100 - 15 -1 0 1N
Velocity (V) V 27 16 100 - 25 -1 0 1N
Velocity (V) V 27 16 100 - 35 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 5 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 15 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 25 -1 0 1N
Storm Rel Velocity (SRM) SRM 56 16 100 - 35 -1 0 1N
Composite Ref (CZ) CZ 37 16 100 - -1 -1 0 1N
Composite Ref (CZ) CZ 38 16 400 - -1 -1 0 1N
Lyr Comp Ref Max (LRM) Level 1 LRM 65 8 0 L -1 -1 0 1N
Lyr Comp Ref Max (LRM) Level 2 LRM 66 8 0 M -1 -1 0 1N
Lyr Comp Ref Max (LRM) Level 3 LRM 90 8 0 H -1 -1 0 1N
Lyr Comp Ref MAX (APR) APR 67 16 0 L -1 -1 0 1N
Echo Tops (ET) ET 41 16 0 - -1 -1 0 1N
Vert Integ Liq (VIL) VIL 57 16 0 - -1 -1 0 1N
One Hour Precip (OHP) OHP 78 16 0 - -1 -1 0 1N
Storm Total Precip (STP) STP 80 16 0 - -1 -1 0 1N
VAD Wind Profile (VWP) VWP 48 0 0 - -1 -1 0 1N
Digital Precip Array (DPA) DPA 81 256 400 - -1 -1 0 1N
Velocity (V) V 25 16 100 - 5 -1 0 1N
Base Spectrum Width (SW) SW 28 8 100 - 5 -1 0 1N
Base Spectrum Width (SW) SW 30 8 100 - 5 -1 0 1N
Severe Weather Probablilty (SWP) SWP 47 0 100 - -1 -1 0 1N
Storm Tracking Information (STI) STI 58 0 100 - -1 -1 0 1N
Hail Index (HI) HI 59 0 100 - -1 -1 0 1N
Mesocyclone (M) M 60 0 100 - -1 -1 0 1N
Mesocyclone (MD) MD 141 0 0 - -1 -1 0 1N
Tornadic Vortex Signature (TVS) TVS 61 0 100 - -1 -1 0 1N
Storm Structure (SS) SS 62 0 100 - -1 -1 0 1N
Supplemental Precipitation Data (SPD) SPD 82 0 100 - -1 -1 0 1N
Digital Hybrid Scan Refl (DHR) DHR 32 256 100 - -1 -1 0 1N -1 -1
Storm Total Precip (STP) STP 138 256 200 - -1 -1 0 1N -1 -1 N
RPS List rps-RPGOP-tcp.VCP11.rps created 2010:11:18:17:28:33 ... 46 products
An RPS list contains the fields: Prod-Name, Mnemonic, Prod-Code
Number of Data Levels, Resolution, Layer Code, Elevation, Contour Interval,
Priority, Req Interval, Map, Lower Layer, Upper Layer, multCut, endHour, timeSpan
The record format is: '%-39s %-3s%4d%4d%6d %c%6d%7d%2d%2d%c%3d%3d %c%7d%7d'
Reflectivity (Z) Z 94 256 100 - 8226 -1 0 1N -1 -1 N -1 0
Velocity (V) V 99 256 25 - 8226 -1 0 1N -1 -1 N -1 0
Reflectivity (Z) Z 19 16 100 - 5 -1 0 1N -1 -1 N -1 0
Reflectivity (Z) Z 20 16 200 - 5 -1 0 1N -1 -1 N -1 0
Velocity (V) V 27 16 100 - 5 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 5 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 15 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 25 -1 0 1N -1 -1 N -1 0
Storm Rel Velocity (SRM) SRM 56 16 100 - 35 -1 0 1N -1 -1 N -1 0
Composite Ref (CZ) CZ 37 16 100 - -1 -1 0 1N 2 -1 N -1 0
Composite Ref (CZ) CZ 38 16 400 - -1 -1 0 1N 2 -1 N -1 0
Lyr Comp Ref Max (LRM) Level 1 LRM 65 8 0 L -1 -1 0 1N -1 -1 N -1 0
Lyr Comp Ref Max (LRM) Level 2 LRM 66 8 0 M -1 -1 0 1N -1 -1 N -1 0
Lyr Comp Ref Max (LRM) Level 3 LRM 90 8 0 H -1 -1 0 1N -1 -1 N -1 0
Lyr Comp Ref MAX (APR) APR 67 16 0 L -1 -1 0 1N -1 -1 N -1 0
Echo Tops (ET) ET 41 16 0 - -1 -1 0 1N 2 -1 N -1 0
Vert Integ Liq (VIL) VIL 57 16 0 - -1 -1 0 1N 2 -1 N -1 0
Enhanced Echo Tops (EET) EET 135 256 100 - -1 -1 0 1N -1 -1 N -1 0
Digital Vert Integ Liq (DVL) DVL 134 256 100 - -1 -1 0 1N -1 -1 N -1 0
One Hour Precip (OHP) OHP 78 16 0 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Precip (STP) STP 80 16 0 - -1 -1 0 1N -1 -1 N -1 0
VAD Wind Profile (VWP) VWP 48 0 0 - -1 -1 0 1N -1 -1 N -1 0
Digital Precip Array (DPA) DPA 81 256 400 - -1 -1 0 1N -1 -1 N -1 0
Base Spectrum Width (SW) SW 28 8 100 - 5 -1 0 1N -1 -1 N -1 0
Base Spectrum Width (SW) SW 30 8 100 - 5 -1 0 1N -1 -1 N -1 0
Storm Tracking Information (STI) STI 58 0 100 - -1 -1 0 1N 2 -1 N -1 0
Hail Index (HI) HI 59 0 100 - -1 -1 0 1N 2 -1 N -1 0
Mesocyclone (MD) MD 141 0 0 - 1 -1 0 1N 2 -1 N -1 0
Tornadic Vortex Signature (TVS) TVS 61 0 100 - -1 -1 0 1N 2 -1 N -1 0
Storm Structure (SS) SS 62 0 100 - -1 -1 0 1N -1 -1 N -1 0
Supplemental Precipitation Data (SPD) SPD 82 0 100 - -1 -1 0 1N -1 -1 N -1 0
Digital Hybrid Scan Refl (DHR) DHR 32 256 100 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Precip (STP) STP 138 256 200 - -1 -1 0 1N -1 -1 N -1 0
Differential Refl (ZDR) ZDR 159 256 25 - 8226 -1 0 1N -1 -1 N -1 0
Correlation Coeff (CC) CC 161 256 25 - 8226 -1 0 1N -1 -1 N -1 0
Specific Diff Phase (KDP) KDP 163 256 25 - 8226 -1 0 1N -1 -1 N -1 0
Hydrometeor Class (HC) HC 165 256 25 - 8226 -1 0 1N -1 -1 N -1 0
Melting Layer (ML) ML 166 0 0 - 8226 -1 0 1N -1 -1 N -1 0
Digital Inst Precip Rate (DPR) DPR 176 0 25 - -1 -1 0 1N -1 -1 N -1 0
Hybrid Hydrometeor Class (HHC) HHC 177 256 25 - -1 -1 0 1N -1 -1 N -1 0
One Hour Accum (OHA) OHA 169 16 200 - -1 -1 0 1N -1 -1 N -1 0
One Hour Unbiased Accum (DAA) DAA 170 256 25 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Accum (STA) STA 171 16 200 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Accum (STA) STA 172 256 25 - -1 -1 0 1N -1 -1 N -1 0
One Hour Diff (DOD) DOD 174 256 25 - -1 -1 0 1N -1 -1 N -1 0
Storm Total Diff (DSD) DSD 175 256 25 - -1 -1 0 1N -1 -1 N -1 0

View file

@ -24,12 +24,12 @@
41 0 NET SDUS7
48 0 NVW SDUS3
57 0 NVL SDUS5
58 0 NST SDUS6
58 0 NST SDUS3
59 0 NHI SDUS6
61 0 NTV SDUS6
78 0 N1P SDUS3
80 0 NTP SDUS5
81 0 DPA SDUS8
81 0 DPA SDUS5
82 0 SPD SDUS6
138 0 DSP SDUS5
141 0 NMD SDUS3

View file

@ -1,6 +1,6 @@
#Radar Connection Characteristic D'n' Key
#D1 - LAN 10 mbps
#D2 - FR DoD 256 kbps
#D2 - FR DoD 1.54 mbps
#D3 - FAA FR 256 kbps
#D4 - NWS & DoD Supplemental FR 128 kbps
#D5 - NWS & DoD Supplemental FR 256 kbps
@ -8,7 +8,7 @@
#D7 - Dedicated Backup Across WAN 128 kbps Aggregate
#D8 - ASR-4/ARSR-11 radars
#
#Site ID Region numRpgs RPGs 020209
#Site ID Region numRpgs RPGs 071911
KABQ 5 5 ABXYD1 FDXYD2 EPZND7 HDXND7 AMAND7
KABR 3 4 ABRYD1 FSDND7 BISND7 MBXND7
KAKQ 1 4 AKQYD1 DOXYD2 MHXND7 RAXND7
@ -87,7 +87,7 @@ KLZK 4 4 LZKYD1 SRXND4 NQAND7 INXND7
KMAF 4 5 MAFYD1 SJTND7 DYXND7 EPZND7 HDXND7
KMEG 4 7 NQAYD1 GWXND4 MEMYD6 LZKND7 OHXND7 PAHND7 SRXND7
KMFL 2 7 AMXYD1 BYXND4 FLLYD6 MIAYD6 PBIYD6 JUAND7 TBWND7
KMFR 6 4 MAXYD1 BHXND7 ATXND7 RTXND7
KMFR 6 5 MAXYD1 BHXND7 ATXND7 LGXND7 RTXND7
KMHX 2 4 MHXYD1 AKQND7 DOXND7 LTXND7
KMKX 3 4 MKXYD1 MKEYD6 GRBND7 LOTND7
KMLB 2 5 MLBYD1 MCOYD6 TBWND7 JUAND7 AMXND7
@ -96,7 +96,7 @@ KMPX 3 4 MPXYD1 MSPYD6 DLHND7 FSDND7
KMQT 3 3 MQTYD1 APXND7 GRBND7
KMRX 4 5 MRXYD1 HTXND4 OHXND7 FFCND7 JGXND7
KMSO 5 3 MSXYD1 TFXND7 OTXND7
KMSR 3 1 MPXND1
KMSR 3 2 MPXND1 MSPND6
KMTR 6 6 MUXYD1 BHXND7 VTXND7 VBXND7 NKXND7 SOXND7
KOAX 3 3 OAXYD1 UEXND7 DMXND7
KOHX 4 6 OHXYD1 HTXND4 BNAYD6 MRXND7 NQAND7 GWXND7
@ -110,7 +110,7 @@ KPBZ 1 4 PBZYD1 PITYD6 RLXND7 BUFND7
KPDT 6 3 PDTYD1 OTXND7 CBXND7
KPHI 1 5 DIXYD1 DOXND4 PHLYD6 LWXND7 OKXND7
KPIH 5 4 SFXYD1 MTXND4 CBXND7 ICXND7
KPQR 6 3 RTXYD1 ATXND7 MAXND7
KPQR 6 4 RTXYD1 LGXND5 ATXND7 MAXND7
KPSR 5 5 IWAYD1 YUXYD1 PHXYD6 EMXND7 FSXND7
KPTR 6 1 RTXND1
KPUB 5 3 PUXYD1 FTGND7 GLDND7
@ -121,7 +121,7 @@ KRIW 5 3 RIWYD1 BLXND7 CYSND7
KRLX 1 3 RLXYD1 PBZND7 JKLND7
KRNK 1 3 FCXYD1 RAXND7 GSPND7
KRSA 6 1 DAXND1
KSEW 6 4 ATXYD1 RTXND7 PDTND7 QKWND8
KSEW 6 5 ATXYD1 LGXYD1 RTXND7 PDTND7 QKWND8
KSGF 3 5 SGFYD1 EAXND7 PAHND7 VWXND7 HPXND7
KSGX 6 6 NKXYD1 SOXYD1 EYXND5 VTXND7 VBXND7 HNXND7
KSHV 4 7 SHVYD1 LZKND4 FWSND7 GRKND7 DGXND7 GWXND7 SRXND7
@ -144,8 +144,8 @@ KVEF 5 6 ESXYD1 EYXYD2 LASYD6 FSXND7 IWAND7 YUXND7
KVHW 5 2 MTXND5 ICXND5
KVUY 1 1 OKXND5
KWNO 1 1 LWXND5
PACR 8 7 ABCYD3 AKCYD3 AHGND7 AIHND7 APDND7 AECND7 ACGND7
PAFC 8 7 AHGYD3 AIHYD3 ABCND7 AKCND7 APDND7 AECND7 ACGND7
PACR 8 7 ABCND7 AKCND7 AHGND7 AIHND7 APDND7 AECND7 ACGND7
PAFC 8 7 AHGYD3 AIHYD3 ABCYD3 AKCYD3 APDND7 AECND7 ACGND7
PAFG 9 7 AECYD3 APDYD3 AHGND7 AIHND7 ABCND7 AKCND7 ACGND7
PAJK 7 7 ACGYD3 AHGND7 AIHND7 ABCND7 AKCND7 APDND7 AECND7
PGUM 0 1 GUAYD1

View file

@ -19,10 +19,29 @@
**/
package com.raytheon.rcm.config;
import com.raytheon.rcm.event.RadarEventListener;
/**
* Interface to configurations that can be changed at runtime.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Support arbitrary config files.
* </pre>
*
*/
public interface MutableConfiguration {
// TODO: need to return usable error messages...
public boolean setGlobalConfig(Globals globals);
public boolean setRadarConfig(RadarConfig rc);
public boolean addRadarConfig(RadarConfig rc);
public boolean removeRadarConfig(String radarID);
public RadarEventListener getConfigurationEventTarget();
public void setConfigurationEventTarget(RadarEventListener configurationEventTarget);
// TODO: need to return usable error messages...
public boolean setGlobalConfig(Globals globals);
public boolean setRadarConfig(RadarConfig rc);
public boolean addRadarConfig(RadarConfig rc);
public boolean removeRadarConfig(String radarID);
public boolean storeConfigFile(String name, byte[] data);
}

View file

@ -26,22 +26,46 @@ import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.rcm.config.RadarConfig;
/**
* Represents events that can happen within the RadarServer.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 2009-04-22 #1693 D. Friedman Initial checkin
* ...
* 2014-02-03 DR 14762 D. Friedman Add Category enum
* </pre>
*
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ConfigEvent {
public static enum Category { GLOBAL_CONFIG, RADAR_CONFIG, PROD_DISTRIBUTION, NATIONAL_RPS_LISTS }
private String radarID; // null indicates global configuration change.
private RadarConfig oldConfig;
private RadarConfig newConfig;
private Category category;
/** Public constructor for deserialization. Not intended for users. */
public ConfigEvent() {
}
public ConfigEvent(Category category) {
this.category = category;
}
public ConfigEvent(String radarID, RadarConfig oldConfig,
RadarConfig newConfig) {
this.radarID = radarID;
this.oldConfig = oldConfig;
this.newConfig = newConfig;
this.category = radarID == null ? Category.GLOBAL_CONFIG : Category.RADAR_CONFIG;
}
public String getRadarID() {
@ -74,4 +98,12 @@ public class ConfigEvent {
else
return "{Global config change}";
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}

View file

@ -35,6 +35,19 @@ import com.raytheon.rcm.request.Request;
import com.raytheon.rcm.rmr.MultipleRequest;
/**
* Request messages that can be sent to the RadarServer.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Add SendConfigFile
* </pre>
*
*/
@XmlSeeAlso({ReqObj.GetRadarList.class,
ReqObj.GetRadarConfig.class, ReqObj.SetRadarConfig.class,
ReqObj.GetRadarStatus.class, ReqObj.GetRadarStatusMessages.class,
@ -45,7 +58,8 @@ import com.raytheon.rcm.rmr.MultipleRequest;
ReqObj.GetGlobalConfig.class, ReqObj.SetGlobalConfig.class,
ReqObj.ActivateRMR.class, ReqObj.CancelRMR.class,
ReqObj.GetActiveRMRs.class, ReqObj.GetAlertRequest.class,
ReqObj.SendAlertRequest.class, ReqObj.SendMessageToRPG.class})
ReqObj.SendAlertRequest.class, ReqObj.SendMessageToRPG.class,
ReqObj.SendConfigFile.class})
public class ReqObj {
@XmlRootElement
public static class GetRadarList extends ReqObj {
@ -121,6 +135,16 @@ public class ReqObj {
// nothing else
}
@XmlRootElement
public static class SendConfigFile extends ReqObj {
public String fileName;
public byte[] fileData;
public String toString() {
return String.format("%s(%s, ...)",
getClass().getSimpleName(), fileName);
}
}
@XmlRootElement
public static class ActivateRMR extends ReqObj {
public MultipleRequest multipleRequest;

View file

@ -66,6 +66,7 @@ import com.raytheon.rcm.mqsrvr.ReqObj.GetRadarList;
import com.raytheon.rcm.mqsrvr.ReqObj.GetRadarStatusMessages;
import com.raytheon.rcm.mqsrvr.ReqObj.GetRpsList;
import com.raytheon.rcm.mqsrvr.ReqObj.SendAlertRequest;
import com.raytheon.rcm.mqsrvr.ReqObj.SendConfigFile;
import com.raytheon.rcm.mqsrvr.ReqObj.SendMessageToRPG;
import com.raytheon.rcm.mqsrvr.ReqObj.SendOneTimeRequests;
import com.raytheon.rcm.mqsrvr.ReqObj.SendRpsList;
@ -79,6 +80,19 @@ import com.raytheon.rcm.server.Log;
import com.raytheon.rcm.server.RadarServer;
import com.raytheon.rcm.server.StatusManager.RadarStatus;
/**
* JMS-based RadarServer request message handler.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Handle NDM config files.
* </pre>
*
*/
public class MsgServ implements RadarEventListener, MessageListener {
QueueConnection queueConn;
@ -313,6 +327,9 @@ public class MsgServ implements RadarEventListener, MessageListener {
} else if (ro instanceof SendMessageToRPG) {
SendMessageToRPG ro2 = (SendMessageToRPG) ro;
error = serv.sendMessageToRPG(ro2.radarID, ro2.message);
} else if (ro instanceof SendConfigFile) {
SendConfigFile ro2 = (SendConfigFile) ro;
error = serv.sendConfigFile(ro2.fileName, ro2.fileData);
} else if (ro instanceof DebugCommand) {
DebugCommand.Command c = ((DebugCommand) ro).command;
if (c == DebugCommand.Command.LOG_OTR_STATUS)

View file

@ -28,7 +28,6 @@ import java.util.Map;
import javax.xml.bind.JAXBException;
import com.raytheon.rcm.event.ConfigEvent;
import com.raytheon.rcm.event.RadarEvent;
import com.raytheon.rcm.event.RadarEventListener;
import com.raytheon.rcm.alertreq.AlertRequestDefinition;
@ -53,6 +52,19 @@ import com.raytheon.rcm.server.StatusManager;
import com.raytheon.rcm.server.StatusManager.RadarStatus;
/**
* Common RadarServer request message handler.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Handle NDM config files.
* </pre>
*
*/
public class Serv {
protected RadarServer server;
@ -236,9 +248,6 @@ public class Serv {
return "The RadarServer's current configuration system does not support live changes.";
MutableConfiguration mc = (MutableConfiguration) config;
boolean result = mc.setGlobalConfig(global);
ConfigEvent ev = new ConfigEvent();
server.handleConfigEvent(ev);
if (result)
return null;
@ -251,12 +260,8 @@ public class Serv {
if (! (config instanceof MutableConfiguration))
return "The RadarServer's current configuration system does not support live changes.";
MutableConfiguration mc = (MutableConfiguration) config;
RadarConfig oldConfig = config.getConfigForRadar(rc.getRadarID());
boolean result = mc.setRadarConfig(rc);
ConfigEvent ev = new ConfigEvent(rc.getRadarID(), oldConfig, rc);
server.handleConfigEvent(ev);
if (result)
return null;
else
@ -288,4 +293,16 @@ public class Serv {
server.getConnectionManager().sendMessageToRadar(radarID, message);
return null;
}
public String sendConfigFile(String fileName, byte[] fileData) {
Configuration config = server.getConfiguration();
if (! (config instanceof MutableConfiguration))
return "The RadarServer's current configuration system does not support live changes.";
MutableConfiguration mc = (MutableConfiguration) config;
boolean result = mc.storeConfigFile(fileName, fileData);
if (result)
return null;
else
return "Error updating configuration.";
}
}

View file

@ -48,6 +48,7 @@ import org.itadaki.bzip2.BZip2InputStream;
import com.raytheon.rcm.config.EndpointConfig;
import com.raytheon.rcm.config.awips1.Awips1ProdDistInfoBuilder;
import com.raytheon.rcm.event.ConfigEvent;
import com.raytheon.rcm.event.ConfigEvent.Category;
import com.raytheon.rcm.event.RadarEvent;
import com.raytheon.rcm.event.RadarEventAdapter;
import com.raytheon.rcm.message.GraphicProduct;
@ -60,6 +61,19 @@ import com.raytheon.rcm.products.RadarProduct.Param;
import com.raytheon.rcm.server.Log;
import com.raytheon.rcm.server.RadarServer;
/**
* Stores radar messages in a directory structure and notifies EDEX via JMS.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Refactor config events.
* </pre>
*
*/
public class DataArchiveEndpoint extends RadarEventAdapter {
private RadarServer radarServer;
@ -638,7 +652,7 @@ public class DataArchiveEndpoint extends RadarEventAdapter {
@Override
public void handleConfigEvent(ConfigEvent event) {
if (event.getRadarID() == null)
if (event.getCategory() == Category.GLOBAL_CONFIG)
updateConfig();
}

View file

@ -42,6 +42,9 @@ import com.raytheon.rcm.config.RadarType;
import com.raytheon.rcm.config.StandardProductDistInfoDB;
import com.raytheon.rcm.config.Util;
import com.raytheon.rcm.config.awips1.Awips1RpsListUtil;
import com.raytheon.rcm.event.ConfigEvent;
import com.raytheon.rcm.event.ConfigEvent.Category;
import com.raytheon.rcm.event.RadarEventListener;
import com.raytheon.rcm.message.GSM;
import com.raytheon.rcm.message.GraphicProduct.PDB;
import com.raytheon.rcm.request.RpsList;
@ -49,6 +52,20 @@ import com.raytheon.rcm.request.RpsXml;
import com.raytheon.rcm.server.Log;
/**
* Represents the standard configuration model of the AWIPS 2 RadarServer.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Handle updated NDM config files.
* Send configuration events.
* </pre>
*
*/
public class StandardConfig implements Configuration, MutableConfiguration {
final String generalPropBase = "com.raytheon.rcm";
@ -58,6 +75,7 @@ public class StandardConfig implements Configuration, MutableConfiguration {
private StandardConfigProvider provider;
private HashMap<String, RadarConfig> radars = new HashMap<String, RadarConfig>();
private StandardProductDistInfoDB prodDistInfoDB = new StandardProductDistInfoDB();
private RadarEventListener configurationEventTarget;
private int regionCodeFromWmoSiteInfo;
@ -88,11 +106,20 @@ public class StandardConfig implements Configuration, MutableConfiguration {
return prodDistInfoDB;
}
public void setProdDistInfoDB(StandardProductDistInfoDB prodDistInfoDB) {
this.prodDistInfoDB = prodDistInfoDB;
if (configurationEventTarget != null) {
ConfigEvent ev = new ConfigEvent(Category.PROD_DISTRIBUTION);
configurationEventTarget.handleConfigEvent(ev);
}
}
@Override
public ProductDistributionInfo getProductDistInfo(String radarID, PDB pdb) {
RadarConfig rc = getConfigForRadar(radarID);
if (prodDistInfoDB != null && rc != null)
return prodDistInfoDB.getProductDistInfo(rc, pdb.productCode, pdb);
StandardProductDistInfoDB db = prodDistInfoDB;
if (db != null && rc != null)
return db.getProductDistInfo(rc, pdb.productCode, pdb);
else
return null;
}
@ -101,8 +128,9 @@ public class StandardConfig implements Configuration, MutableConfiguration {
public ProductDistributionInfo getProductDistInfo(String radarID,
int messageCode) {
RadarConfig rc = getConfigForRadar(radarID);
if (prodDistInfoDB != null && rc != null)
return prodDistInfoDB.getProductDistInfo(rc, messageCode, null);
StandardProductDistInfoDB db = prodDistInfoDB;
if (db != null && rc != null)
return db.getProductDistInfo(rc, messageCode, null);
else
return null;
}
@ -299,6 +327,10 @@ public class StandardConfig implements Configuration, MutableConfiguration {
void setRegionCodeFromWmoSiteInfo(int regionCodeFromWmoSiteInfo) {
this.regionCodeFromWmoSiteInfo = regionCodeFromWmoSiteInfo;
/* There is currently no need to send a configuration event for this
* because the value is always queried from the configuration when
* it is used.
*/
}
// TODO: Should not have to care about the opMode...
@ -348,8 +380,13 @@ public class StandardConfig implements Configuration, MutableConfiguration {
// doc.regionCode = globals.regionCode; // Setting this directly is not supported...
doc.regionCode = null;
provider.updateRegionCode();
return saveConfig();
boolean result = saveConfig();
if (configurationEventTarget != null) {
ConfigEvent ev = new ConfigEvent(Category.GLOBAL_CONFIG);
configurationEventTarget.handleConfigEvent(ev);
}
return result;
}
private boolean saveConfig() {
@ -386,7 +423,13 @@ public class StandardConfig implements Configuration, MutableConfiguration {
RadarConfig oldConfig = radars.get(rc.getRadarID());
if (oldConfig != null) {
radars.put(rc.getRadarID(), rc);
return saveConfig();
boolean result = saveConfig();
if (configurationEventTarget != null) {
ConfigEvent ev = new ConfigEvent(rc.getRadarID(), oldConfig, rc);
configurationEventTarget.handleConfigEvent(ev);
}
return result;
} else {
Log.errorf("Attempt to change configuration of unknown radar '%s'", rc.getRadarID());
return false;
@ -431,4 +474,25 @@ public class StandardConfig implements Configuration, MutableConfiguration {
return new FileInputStream(res.getDropInPath(name));
}
/*package*/ void notifyNationalRpsLists() {
if (configurationEventTarget != null) {
ConfigEvent ev = new ConfigEvent(Category.NATIONAL_RPS_LISTS);
configurationEventTarget.handleConfigEvent(ev);
}
}
public boolean storeConfigFile(String name, byte[] data) {
// Delegate to provider
return provider.storeNdmConfigFile(name, data);
}
public RadarEventListener getConfigurationEventTarget() {
return configurationEventTarget;
}
public void setConfigurationEventTarget(
RadarEventListener configurationEventTarget) {
this.configurationEventTarget = configurationEventTarget;
}
}

View file

@ -21,9 +21,12 @@ package com.raytheon.rcm.config.std;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.regex.Pattern;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
@ -40,8 +43,26 @@ import com.raytheon.rcm.config.awips1.Awips1ConfigProvider;
import com.raytheon.rcm.server.Log;
/**
* Constructs (and potentially updates) a StandardConfig based on
* various configuration files.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Handle updated NDM config files.
* </pre>
*
*/
public class StandardConfigProvider implements ConfigurationProvider {
private static String WSR_88D_PROD_LIST_NAME = "prodList.txt";
private static String TDWR__PROD_LIST_NAME = "tdwrProdList.txt";
private static String WMO_SITE_INFO_NAME = "wmoSiteInfo.txt";
private static JAXBContext jaxbContext;
private static Unmarshaller u;
private static Marshaller m;
@ -113,15 +134,20 @@ public class StandardConfigProvider implements ConfigurationProvider {
config.setRadars(radars);
}
StandardProductDistInfoDB db = config.getProdDistInfoDB();
tryAddProdList(db, false, "prodList.txt");
tryAddProdList(db, true, "tdwrProdList.txt");
loadProdListDB();
updateRegionCode();
}
// Ugh. Bleh. Duplicating code from Awips1ConfigProvider
private void loadProdListDB() {
StandardProductDistInfoDB db = new StandardProductDistInfoDB();
tryAddProdList(db, false, WSR_88D_PROD_LIST_NAME);
tryAddProdList(db, true, TDWR__PROD_LIST_NAME);
config.setProdDistInfoDB(db);
}
// TODO: Duplicating code from Awips1ConfigProvider
protected static boolean skipComments(Scanner s) {
try {
s.skip("^\\s*(#|//).*$");
@ -133,9 +159,9 @@ public class StandardConfigProvider implements ConfigurationProvider {
public void updateRegionCode() {
try {
readWmoSiteInfo(res.getNdmFile("wmoSiteInfo.txt"));
readWmoSiteInfo(res.getNdmFile(WMO_SITE_INFO_NAME));
} catch (Exception e) {
Log.errorf("Could not process wmoSiteInfo.txt: %s", e);
Log.errorf("Could not process %s.txt: %s", WMO_SITE_INFO_NAME, e);
}
}
@ -209,4 +235,43 @@ public class StandardConfigProvider implements ConfigurationProvider {
return new File(res.getPrivateDir(), "config.xml");
}
public boolean storeNdmConfigFile(String name, byte[] data) {
File f = new File(name);
if (f.getParent() != null) {
Log.error("Attempt to store NDM config file with a specific directory: " + name);
return false;
}
File path = res.getDropInPath(name);
try {
FileOutputStream fos = new FileOutputStream(path);
try {
fos.write(data);
} finally {
try {
fos.close();
} catch (IOException e) {
// ignore
}
}
} catch (IOException e) {
Log.errorf("Failed to store NDM config file %s: %s", path, e);
return false;
}
Log.eventf("Stored new version of NDM config %s.", name);
if (WSR_88D_PROD_LIST_NAME.equals(name) ||
TDWR__PROD_LIST_NAME.equals(name)) {
loadProdListDB();
} else if (WMO_SITE_INFO_NAME.equals(name)) {
updateRegionCode();
} else if (Pattern.matches("^rps-.*OP.*$", name)) {
config.notifyNationalRpsLists();
} else {
Log.warnf("No action taken for new %s. You may need to restart for changes to take affect.", name);
}
return true;
}
}

View file

@ -25,8 +25,8 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.ListIterator;
import java.util.concurrent.ConcurrentHashMap;
import com.raytheon.rcm.config.Configuration;
import com.raytheon.rcm.config.EndpointConfig;
@ -35,6 +35,7 @@ import com.raytheon.rcm.config.RadarConfig;
import com.raytheon.rcm.config.RadarType;
import com.raytheon.rcm.config.Util;
import com.raytheon.rcm.event.ConfigEvent;
import com.raytheon.rcm.event.ConfigEvent.Category;
import com.raytheon.rcm.event.RadarEvent;
import com.raytheon.rcm.event.RadarEventAdapter;
import com.raytheon.rcm.message.GSM;
@ -69,6 +70,7 @@ import com.raytheon.rcm.server.StatusManager.RadarStatus;
* 2009-04-22 #1693 D. Friedman Initial checkin
* ...
* 2013-01-31 DR 15458 D. Friedman Explicitly handle UNSPECIFIED_VCP.
* 2014-02-03 DR 14762 D. Friedman Handle updated national RPS lists.
* </pre>
*
*/
@ -79,13 +81,11 @@ public class RPSListManager extends RadarEventAdapter {
RadarServer radarServer;
HashMap<String, RpsList> immediateLists = new HashMap<String, RpsList>(); // TODO:
// on sendRpsList (not store), set. on (true) vcp change, remove. should
// persist...
HashMap<String, RpsList> currentRpsLists = new HashMap<String, RpsList>();
ConcurrentHashMap<String, RpsList> currentRpsLists = new ConcurrentHashMap<String, RpsList>();
HashMap<String, Integer> currentVcps = new HashMap<String, Integer>();
ConcurrentHashMap<String, Integer> currentVcps = new ConcurrentHashMap<String, Integer>();
/**
* Indicates RadarServer should generate AWIPS 1 style RPS lists. There does
@ -580,23 +580,35 @@ public class RPSListManager extends RadarEventAdapter {
&& newCfg.isDedicated()
&& (oldCfg.isCollectionEnabled() != newCfg
.isCollectionEnabled())) {
String radarID = newCfg.getRadarID();
RadarStatus status = radarServer.getStatusManager()
.getRadarStatus(radarID);
byte[] gsmData = null;
if (status != null)
gsmData = status.getCurrentGSM();
currentVcps.remove(radarID);
currentRpsLists.remove(radarID);
if (gsmData != null) {
handleGSM(newCfg, gsmData);
} else {
Log.debugf(
"RPS-relevant configuration changed for %s, but "
+ "it is not connected. Cannot send a list now.",
radarID);
resetRpsListForRadar(newCfg);
}
} else if (event.getCategory() == Category.NATIONAL_RPS_LISTS) {
Configuration config = radarServer.getConfiguration();
for (String radarID : config.getConfiguredRadarList()) {
RadarConfig rc = config.getConfigForRadar(radarID);
if (rc.isCollectionEnabled()) {
resetRpsListForRadar(rc);
}
}
}
}
private void resetRpsListForRadar(RadarConfig rc) {
String radarID = rc.getRadarID();
RadarStatus status = radarServer.getStatusManager()
.getRadarStatus(radarID);
byte[] gsmData = null;
if (status != null)
gsmData = status.getCurrentGSM();
currentVcps.remove(radarID);
currentRpsLists.remove(radarID);
if (gsmData != null) {
handleGSM(rc, gsmData);
} else {
Log.debugf(
"RPS-relevant configuration changed for %s, but "
+ "it is not connected. Cannot send a list now.",
radarID);
}
}
}

View file

@ -30,6 +30,7 @@ import java.nio.ByteBuffer;
import org.itadaki.bzip2.BZip2InputStream;
import com.raytheon.rcm.event.ConfigEvent;
import com.raytheon.rcm.event.ConfigEvent.Category;
import com.raytheon.rcm.event.RadarEvent;
import com.raytheon.rcm.event.RadarEventAdapter;
import com.raytheon.rcm.message.GraphicProduct;
@ -38,9 +39,20 @@ import com.raytheon.rcm.message.Message;
import com.raytheon.rcm.message.MessageFormatException;
/**
* A radar server component that delivers radar products to an EDEX file
* <p>A radar server component that delivers radar products to an EDEX file
* endpoint.
*/
*
* <p>This class is obsoleted by DataArchiveEndpoint.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Refactor config events.
* </pre>
*/
public class Awips2Endpoint extends RadarEventAdapter {
RadarServer radarServer;
@ -152,7 +164,7 @@ public class Awips2Endpoint extends RadarEventAdapter {
@Override
public void handleConfigEvent(ConfigEvent event) {
if (event.getRadarID() == null)
if (event.getCategory() == Category.GLOBAL_CONFIG)
updateConfig();
}

View file

@ -26,6 +26,7 @@ import com.raytheon.rcm.coll.Collector;
import com.raytheon.rcm.coll.RequestScheduler;
import com.raytheon.rcm.config.Configuration;
import com.raytheon.rcm.config.ConfigurationProvider;
import com.raytheon.rcm.config.MutableConfiguration;
import com.raytheon.rcm.event.ConfigEvent;
import com.raytheon.rcm.event.NotificationEvent;
import com.raytheon.rcm.event.RadarEvent;
@ -38,6 +39,16 @@ import com.raytheon.rcm.rpsmgr.RPSListManager;
* Main class for the Radar Server.
* <p>
* This is a container class for the various components of the Radar Server.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ...
* 2014-02-03 DR 14762 D. Friedman Connect configuration's event target to
* the RadarServer instance.
* </pre>
*/
public class RadarServer implements RadarEventListener {
// protected ConfigurationProvider configurationProvider;
@ -97,6 +108,9 @@ public class RadarServer implements RadarEventListener {
connectionManager = new ConnectionManagerImpl(this, linkManager);
addListener(connectionManager);
// connectionManager =
if (configuration instanceof MutableConfiguration) {
((MutableConfiguration) configuration).setConfigurationEventTarget(this);
}
}
public void addDefaultListeners() {

View file

@ -194,7 +194,6 @@ fi
BASE_LOGDIR=$HOME/caveData/logs/consoleLogs
LOGDIR=$BASE_LOGDIR/$hostName/
# make sure directory exists
if [ ! -d $LOGDIR ]; then
mkdir -p $LOGDIR

View file

@ -26,18 +26,48 @@
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name" />
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true"
outlineWidth="1" />
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false"
isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="dbPointMapResourceData">
<table>mapdata.city</table>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false" isVisible="true" />
<resourceData xsi:type="mapResourceGroupData">
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name" />
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true"
outlineWidth="1" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false"
isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="dbPointMapResourceData">
<table>mapdata.city</table>
<mapName>Cities</mapName>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name" />
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true" outlineWidth="1" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false" isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="lpiResourceData">
<filename>cities.lpi</filename>
<mapName>Cities</mapName>
</resourceData>
</resource>
<mapName>Cities</mapName>
</resourceData>
</resource>

View file

@ -25,19 +25,49 @@
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true"
outlineWidth="1" />
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name"/>
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true"
isHoverOn="false" isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="dbPointMapResourceData">
<table>mapdata.airport</table>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false" isVisible="true" />
<resourceData xsi:type="mapResourceGroupData">
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true"
outlineWidth="1" />
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name"/>
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true"
isHoverOn="false" isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="dbPointMapResourceData">
<table>mapdata.airport</table>
<mapName>Airports</mapName>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name" />
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true" outlineWidth="1" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false" isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="lpiResourceData">
<filename>airport.lpi</filename>
<mapName>Airports</mapName>
</resourceData>
</resource>
<mapName>Airports</mapName>
</resourceData>
</resource>

View file

@ -25,22 +25,52 @@
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true"
outlineWidth="1" />
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="pointCapability" pointStyle="NONE"/>
<capability xsi:type="labelableCapability" labelField="id"/>
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false"
isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="dbPointMapResourceData">
<table>mapdata.fix</table>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false" isVisible="true" />
<resourceData xsi:type="mapResourceGroupData">
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true"
outlineWidth="1" />
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="pointCapability" pointStyle="NONE"/>
<capability xsi:type="labelableCapability" labelField="id"/>
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false"
isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="dbPointMapResourceData">
<table>mapdata.fix</table>
<mapName>Fixes/Intersections</mapName>
<constraint>type != 'NU'</constraint>
</resourceData>
</resource>
<resource>
<loadProperties>
<capabilities>
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
<capability xsi:type="labelableCapability" labelField="name" />
<capability xsi:type="outlineCapability" lineStyle="SOLID" outlineOn="true" outlineWidth="1" />
</capabilities>
<resourceType>PLAN_VIEW</resourceType>
</loadProperties>
<properties isSystemResource="false" isBlinking="false" isMapLayer="true" isHoverOn="false" isVisible="true">
<pdProps maxDisplayWidth="100000000" minDisplayWidth="0" />
</properties>
<resourceData xsi:type="lpiResourceData">
<filename>fix.lpi</filename>
<mapName>Fixes/Intersections</mapName>
</resourceData>
</resource>
<mapName>Fixes/Intersections</mapName>
<constraint>type != 'NU'</constraint>
</resourceData>
</resource>
</descriptor>

View file

@ -26,14 +26,15 @@ import java.util.Set;
import com.raytheon.uf.viz.cloudheight.rsc.CloudHeightResource;
import com.raytheon.uf.viz.cloudheight.rsc.CloudHeightResourceData;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.IRenderableDisplay;
import com.raytheon.uf.viz.core.drawables.ResourcePair;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.AbstractResourceData;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource.ResourceStatus;
import com.raytheon.uf.viz.core.rsc.IInitListener;
import com.raytheon.uf.viz.core.rsc.IResourceGroup;
import com.raytheon.uf.viz.core.rsc.ResourceList;
import com.raytheon.uf.viz.core.rsc.ResourceList.AddListener;
import com.raytheon.uf.viz.core.rsc.ResourceList.RemoveListener;
@ -53,9 +54,10 @@ import com.raytheon.viz.ui.perspectives.IRenderableDisplayCustomizer;
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 31, 2013 2190 mschenke Initial creation
* Date Ticket# Engineer Description
* ------------- -------- ----------- --------------------------
* Jul 31, 2013 2190 mschenke Initial creation
* Mar 20, 2014 2932 bsteffen Better support of blended resources.
*
* </pre>
*
@ -198,8 +200,22 @@ public class D2DPopupSkewTDisplayCustomizer implements
}
private boolean isCompatibleResource(ResourcePair rp) {
return COMPATIBLE_CLASSES.contains(rp.getResourceData().getClass())
&& CloudHeightResource.isValidContributor(rp.getResource());
AbstractResourceData resourceData = rp.getResourceData();
if (resourceData != null) {
if (COMPATIBLE_CLASSES
.contains(rp.getResourceData().getClass())) {
return CloudHeightResource.isValidContributor(rp
.getResource());
} else if (resourceData instanceof IResourceGroup) {
IResourceGroup group = (IResourceGroup) resourceData;
for (ResourcePair internalPair : group.getResourceList()) {
if (isCompatibleResource(internalPair)) {
return true;
}
}
}
}
return false;
}
private synchronized void addResources(IDescriptor descriptor) {

View file

@ -122,8 +122,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* Jun 06, 2013 2075 njensen Removed loading labels
* Jul 09, 2013 2152 njensen Fix potential widget disposed error
* Jun 20, 2013 14907 gzhang Thresholds menu ColorCell check fix.
* Jan 09, 2014 DR16096 gzhang Fix QPFSCAN not showing M issue for different radar source.
* </pre>
*
* @author lvenable
* @version 1.0
*/
@ -1343,7 +1343,7 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements
// Update the data in the FFMPConfig with the selections
this.ffmpConfig.setVisibleColumns(attrData);
this.ffmpConfig.setAttrData(attrData);
this.ffmpTable.showHideTableColumns();
if( ! updateData) this.ffmpTable.showHideTableColumns(); // DR 16096
boolean changeSplit = false;
if (timeDurScale.split != ffmpConfig.isSplit()) {

View file

@ -80,9 +80,9 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FfmpTableConfigData;
* July 1, 2013 2155 dhladky Fixed bug that created more rows than were actually needed.
* Jul 15, 2013 2184 dhladky Remove all HUC's for storage except ALL
* Jul 16, 2013 2197 njensen Use FFMPBasinData.hasAnyBasins() for efficiency
* Jan 09, 2014 DR16096 gzhang Fix QPFSCAN not showing M issue for different radar source.
*
* </pre>
*
* @author dhladky
* @version 1.0
*/
@ -189,7 +189,7 @@ public class FFMPDataGenerator {
FFMPBasinData fbd = baseRec.getBasinData();
tData = new FFMPTableData(fbd.getBasins().size());
List<List<Long>> huclists = getOtherSiteQpfBasins(siteKey,huc, domains);// DR 16096
for (Long key : fbd.getBasins().keySet()) {
FFMPBasinMetaData fmdb = ft.getBasin(siteKey, key);
@ -199,7 +199,7 @@ public class FFMPDataGenerator {
continue;
}
this.filterOtherSiteHucs(huclists, key);// DR 16096
for (DomainXML domain : domains) {
String cwa = domain.getCwa();
@ -249,7 +249,7 @@ public class FFMPDataGenerator {
List<Long> keyList = ft
.getHucKeyList(siteKey, huc, domains);
tData = new FFMPTableData(keyList.size());
List<List<Long>> huclists = getOtherSiteQpfBasins(siteKey,huc, domains);// DR 16096
for (Long key : keyList) {
List<Long> pfafs = ft.getAggregatePfafs(key, siteKey,
@ -269,7 +269,7 @@ public class FFMPDataGenerator {
if (fmdb != null) {
try {
this.filterOtherSiteHucs(huclists, key);// DR 16096
FFMPBasin basin = new FFMPBasin(key, true);
setFFMPRow(basin, tData, isVGB, null);
@ -298,7 +298,8 @@ public class FFMPDataGenerator {
FFMPBasinMetaData fmdb = ft.getBasin(siteKey, key);
if (fmdb != null) {
if (fmdb != null) {
checkCenteredAggregationKey();// DR 16096 aggregation_county-huc_click
for (DomainXML domain : domains) {
if ((domain.getCwa().equals(fmdb.getCwa()))
|| (domain.isPrimary() && fmdb
@ -430,7 +431,8 @@ public class FFMPDataGenerator {
}
}
if (qpfRecord != null) {
qpfBasin = qpfRecord.getBasinData();
qpfBasin = qpfRecord.getBasinData();
qpfBasinClone = qpfRecord.getBasinData();// DR 16096
}
if (guidRecords != null) {
guidBasins = new HashMap<String, FFMPBasinData>();
@ -465,5 +467,181 @@ public class FFMPDataGenerator {
return field;
}
/** ---------------------------------------------------------- Below is for DR 16096
* use FfmpTableConfigData.setQpfType() to find the QPF type,
* only one at a time with Radio Button on a Basin Table.
*
* see getBaseField() for qpfsource/qpftyp
* and FfmpTableConfigData.setQpfType()
*
* update code one step at a time. correct first; performance,hard-coding second.
*
* @return Map<QPFSCAN type, ArrayList<datakey>> i.e.: <QPFSCANkccx, [kccx] list> / <QPFSCAN, [kakq,klwx] list>
*/
public Map<String,java.util.ArrayList<String>> getQpfDataKeyMap(){
}
Map<String, java.util.ArrayList<String>> map = new HashMap<String,java.util.ArrayList<String>>();
java.util.ArrayList<com.raytheon.uf.common.monitor.xml.FFMPRunXML> runlist = FFMPRunConfigurationManager.getInstance().getFFMPRunners();
java.util.ArrayList<String> qpflist = getQpfTypes();
for(com.raytheon.uf.common.monitor.xml.FFMPRunXML rxml : runlist){
java.util.ArrayList<com.raytheon.uf.common.monitor.xml.SourceIngestConfigXML> sicList = rxml.getSourceIngests();
for(com.raytheon.uf.common.monitor.xml.SourceIngestConfigXML sic : sicList){
String sname = sic.getSourceName();
for(String qpf : qpflist){
if(qpf.equalsIgnoreCase(sname))
map.put(sname, sic.getDataKey());
}
}
}
return map;
}
/**
* Based on AttributesDlg.createAttributeControls(),
* used for adding a QPF column.
* Only qpfs in table column are of interest
* @return
*/
public java.util.ArrayList<String> getQpfTypes(){
ProductXML prodXml = monitor.getProductXML(resource.getPrimarySource());
FFMPRunConfigurationManager runManager = FFMPRunConfigurationManager.getInstance();
ProductRunXML productRun = runManager.getProduct(resource.getSiteKey());
java.util.ArrayList<String> qpfTypes = productRun.getQpfTypes(prodXml);
return qpfTypes;
}
/**
* get displaying dataKeys of the displaying QPFSCAN
* 2014-01-01
*/
public java.util.ArrayList<String> getDisplayingQpfDataKeys(String dqpf){
Map<String,java.util.ArrayList<String>> map = getQpfDataKeyMap();
java.util.ArrayList<String> list = map.get(dqpf);
return list==null ? new java.util.ArrayList<String>() : list;
}
/**
* filtering non-QPFSCAN basins/hucs
* 2014-01-01
* parameter sitekey same as resource.siteKey used for comparing.
*/
public List<List<Long>> getOtherSiteQpfBasins(String siteKey, String huc, List<DomainXML> domains){
String dqpf = getQpfType();
List<List<Long>> huclist = new java.util.ArrayList<List<Long>>();
//if(siteKey.equalsIgnoreCase(dqpf))//Basin Table same as QPFSCAN's datakey
// return huclist;
System.out.println("@551----------- qpf: "+dqpf);//checking qpf type
java.util.ArrayList<String> dataKeys = this.getDisplayingQpfDataKeys(dqpf);//more than one datakey for mosaic QPFSCAN
for(String site : dataKeys){
huclist.add(ft.getHucKeyList(site, huc, domains));
}
return huclist;
}
private FFMPBasinData qpfBasinClone = null;// DR 16096 2014-01-06 initialized @435
public void filterOtherSiteHucs(List<List<Long>> huclists, Long key){
if( huclists==null || huclists.size()==0) // QPFSCAN column is not on 2014-01-09
return;
boolean isInOtherSite = false;
for(List<Long> list : huclists){
if(list.contains(key)){
isInOtherSite = true;
break;
}
}
if(isInOtherSite)
this.qpfBasin = this.qpfBasinClone;
else{
setQPFMissing();
setMList(this.siteKey,this.huc, key);
}// so in FFMPRowGenerator, qpf value will be Float.NaN
//if(key==31051 || key==31119){setQPFMissing(); setMList(this.siteKey,this.huc, key);}//hard-code for testing
}
/**
* based on FFMPConfig.isSplit() and AttributesDlg.createAttributeControls() @176/178
* since Only using AttrData causing all "M" when QPFSCAN column already on.
*/
public String getQpfType(){
String qCname = "";
boolean qpfColOn = false;
try{
qCname=this.ffmpTableCfgData.getTableColumnAttr(ffmpTableCfgData.getTableColumnKeys()[3]).getOriginalName().split("::")[0];//AttributesDlg @176/178
}catch(Exception e){
e.printStackTrace();
}
for (com.raytheon.uf.viz.monitor.ffmp.xml.FFMPTableColumnXML tcXML : monitor.getConfig().getFFMPConfigData().getTableColumnData()) {
if (tcXML.getColumnName().compareTo(FIELDS.QPF.name()) == 0) {
qpfColOn = tcXML.getDisplayedInTable();
}
}
return qpfColOn ? qCname : monitor.getConfig().getAttrData().getQpfType();
}
// An example for below: <kccx,<county,Arrays.asList("NE,Cadar","NE,Dodge")>> so if a county/HUC is M then its basins are all M
private static final Map<String, HashMap<String,java.util.ArrayList<Long>>> M_LIST = new HashMap<String, HashMap<String,java.util.ArrayList<Long>>>();
/**
* Usage: if a County/HUC (aggregation) is M with the QPFSCAN, then its pfaf is cached in the M_LIST
* so when it is clicked, all the basins under it get M as well without having to redo matching.
*
* @param site
* @param huc
* @param key
*/
private static void setMList(String site, String huc, Long key){
HashMap<String,java.util.ArrayList<Long>> map = FFMPDataGenerator.M_LIST.get(site);
if(map==null){
map = new HashMap<String, java.util.ArrayList<Long>>();
M_LIST.put(site,map);
}
java.util.ArrayList<Long> list = map.get(huc);
if(list==null){
list = new java.util.ArrayList<Long>();
map.put(huc, list);
}
list.add(key);
}
// fix for County/HUC M but post_click 0.0 issue
private void checkCenteredAggregationKey(){
if( ! (this.centeredAggregationKey instanceof Long) ) return;
HashMap<String,java.util.ArrayList<Long>> map = FFMPDataGenerator.M_LIST.get(this.siteKey);
if(map==null) return;
java.util.ArrayList<Long> list = map.get(this.huc);
if(list==null) return;
if(list.contains((Long)this.centeredAggregationKey))
this.setQPFMissing();
}
//Utilize the fact FFMPRowGenerator set QPFSCAN M if qpfBasin null
private void setQPFMissing(){
this.qpfBasin = null;
}
}

View file

@ -173,9 +173,9 @@ import com.vividsolutions.jts.geom.Point;
* Jul 15, 2013 2184 dhladky Remove all HUC's for storage except ALL
* Jul 17, 2013 2197 njensen Improved speed of getName()
* Oct 18, 2013 DR 16151 gzhang Used getAverageValue() for QPF Graph.
* Jan 21, 2014 DR 15874 gzhang Use getValue() for QPFSCAN independent.
* Feb 19, 2014 2819 randerso Removed unnecessary .clone() call
* Mar 3, 2014 2804 mschenke Set back up clipping pane
*
* </pre>
*
* @author dhladky
@ -798,9 +798,9 @@ public class FFMPResource extends
} else {
switch (field) {
case QPF: {
value = getBasin(key, field, recentTime, aggregate)
.getAverageValue(recentTime,
getQpfSourceExpiration());
value = getBasin(key, field, recentTime, aggregate).getValue(recentTime);// DR 15874
//.getAverageValue(recentTime,
//getQpfSourceExpiration());
break;
}
case GUIDANCE: {
@ -3166,9 +3166,10 @@ public class FFMPResource extends
// Float qpfFloat = qpfBasin.getValue(monitor.getQpfWindow()
// .getBeforeTime(), monitor.getQpfWindow().getAfterTime());
// DR 16151
Float qpfFloat = qpfBasin.getAverageValue(monitor.getQpfWindow()
.getAfterTime(), monitor.getQpfWindow().getBeforeTime()); // DR
// 16151
.getAfterTime(), monitor.getQpfWindow().getBeforeTime());
fgd.setQpfValue(qpfFloat);
ArrayList<Double> qpfTimes = new ArrayList<Double>();

View file

@ -26,6 +26,7 @@ gov.noaa.nws.ncep.viz.rsc.idft
gov.noaa.nws.ncep.viz.rsc.intlsig
gov.noaa.nws.ncep.viz.rsc.lightning
gov.noaa.nws.ncep.viz.rsc.mosaic
gov.noaa.nws.ncep.viz.rsc.ncgrid
gov.noaa.nws.ncep.viz.rsc.ncscat
gov.noaa.nws.ncep.viz.rsc.nonconvsigmet
gov.noaa.nws.ncep.viz.rsc.plotdata

View file

@ -229,6 +229,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* 08/09/2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR
* 09/04/2013 2322 lvenable Added CAVE style so this dialog is perspective independent
* 10/24/2013 16478 zhao add syntax check for extra '=' sign
* 01/13/2014 16153 zhao Modified qcCheck().
* 01/15/2014 16458 zhao Check for extra '=' sign before 'regular syntax check'
* 02/12/2014 17076 lvenable Mark guidance tabs as not current so they get refreshed
* 02/19/2014 16980 zhao add code to ensure the Alt flag is false after the Alt kay is released
* 21Mar2014 #2925 lvenable Fixed NPE error found during testing.
@ -1781,6 +1783,9 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
syntaxBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if ( checkBasicSyntaxError(true) ) {
return;
}
syntaxCheck();
}
});
@ -2031,7 +2036,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
.getSelectionIndex());
String bbb = editorTafTabComp.getBBB();
// DR166478
// DR16478
if (toolName.equals("UseMetarForPrevailing")) {
if (checkBasicSyntaxError(true)) {
return;
@ -3689,7 +3694,10 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
if (endIndex == -1) {
endIndex = in.length();
}
String line = in.substring(beginIndex, endIndex);
boolean isWrapping = false;
String thisSite = "";
String lastLine = "";
String line = in.substring(beginIndex, endIndex);
int lineNumber = 1;
Set<List<String>> keySet = results.keySet();
int maxLevel = 0;
@ -3699,6 +3707,10 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
int level = 0;
int start = -1;
int length = -1;
if (line.startsWith("TAF")) {
thisSite = in.substring(endIndex+1, endIndex+5);
}
if (!line.startsWith("TAF")) {
if (line.trim().length() == 0) {
@ -3713,6 +3725,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
endIndex = in.length();
}
lastLine = line;
line = in.substring(beginIndex, endIndex);
continue;
}
@ -3726,17 +3739,25 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
.get(key);
if (lineNumber == keyLineNum) {
text = result.get("text").toString() + "\n";
level = Integer.parseInt(result.get("level")
.toString());
start = Integer.parseInt(temp.substring(temp
.indexOf('.') + 1));
temp = key.get(1);
length = Integer.parseInt(temp.substring(temp
.indexOf('.') + 1));
length = length - start;
start = beginIndex + start;
break;
if (!isWrappingLine(line,thisSite)) {
isWrapping = false;
text = result.get("text").toString() + "\n";
level = Integer.parseInt(result.get("level").toString());
start = Integer.parseInt(temp.substring(temp.indexOf('.') + 1));
temp = key.get(1);
length = Integer.parseInt(temp.substring(temp.indexOf('.') + 1));
length = length - start;
start = beginIndex + start;
break;
} else {
// a PROB30 group is wrapped in two lines
isWrapping = true;
text = result.get("text").toString() +"\n";
level = Integer.parseInt(result.get("level").toString());
start = beginIndex - 1 - lastLine.length() + lastLine.indexOf("PROB30");
length = lastLine.substring(lastLine.indexOf("PROB30")).length() + 1 + line.length();
break;
}
}
}
@ -3749,8 +3770,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
start = beginIndex + start;
}
StyleRange sr = new StyleRange(start, length, null,
qcColors[level]);
StyleRange sr = new StyleRange(start, length, null,qcColors[level]);
st.setStyleRange(sr);
qcResultMap.put(sr, text);
@ -3775,6 +3795,7 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
beginIndex = endIndex = in.length();
line = "";
} else {
lastLine = line;
line = in.substring(beginIndex, endIndex);
}
@ -3791,12 +3812,22 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
setMessageStatusError("An Error occured while performing the QC check.");
} catch (IOException e) {
setMessageStatusError("An Error occured while performing the QC check.");
} catch (Exception e) {
setMessageStatusError("An Error occured while performing the QC check.");
} finally {
setWaitCursor(false);
}
}
/**
private boolean isWrappingLine(String line, String site) {
String tempLine = line.trim();
if (tempLine.startsWith(site)||tempLine.startsWith("TEMPO")||tempLine.startsWith("FM")||tempLine.startsWith("PROB30")) {
return false;
}
return true;
}
/**
* Read in the TAF viewer editor config XML.
*
* @return An array of viewer tab configuration data.

View file

@ -63,6 +63,7 @@
# Date Ticket# Engineer Description
# ------------- ---------- ----------- --------------------------
# Feb. 21, 2013 15834 zhao Modified for CCFP 8hr data
# Jan. 14 2014 16289 zhao Modified time format in _makeData() to match A1
#
import logging, time
import Avn, AvnLib, Globals, MonitorP
@ -97,7 +98,7 @@ class Monitor(MonitorP.Monitor):
fcst[vtime] = d = dict(tmp)
ttok = ['%s: %s' % (x.upper(), _Code[x].get(int(d[x]), ''))\
for x in d]
text.append('%sZ %s' % (tok[1][4:-2], ' '.join(ttok)))
text.append('%sZ %s' % (tok[1][6:-2], ' '.join(ttok)))
if not text:
text.append('NIL CONVECTION')
for s in seq:

View file

@ -84,6 +84,7 @@ import com.vividsolutions.jts.geom.LineString;
* 10-21-09 #1711 bsteffen Initial Creation
* 04-07-10 #4614 randerso Reworked to use localization files
* 07-11-12 #875 rferrel Move points to PointsDataManager.
* 01-29-14 DR 16351 D. Friedman Fix updates to storm track from preferences.
*
* </pre>
*
@ -136,6 +137,8 @@ public class ToolsDataManager implements ILocalizationFileObserver,
private Object stormLock = new Object();
private boolean stormTrackDirty = false;
private String site;
private LocalizationFile userToolsDir;
@ -232,7 +235,7 @@ public class ToolsDataManager implements ILocalizationFileObserver,
public StormTrackData getStormTrackData() {
synchronized (stormLock) {
if (stormData == null) {
if (stormData == null || stormTrackDirty) {
loadStormData();
}
return new StormTrackData(stormData);
@ -268,6 +271,7 @@ public class ToolsDataManager implements ILocalizationFileObserver,
if (points != null) {
setCoordinates(stormData, points);
}
stormTrackDirty = false;
}
private void setCoordinates(StormTrackData data, String[] points) {
@ -664,6 +668,11 @@ public class ToolsDataManager implements ILocalizationFileObserver,
} else if (P_STORMTRACK_SPEED.equals(key)
&& value instanceof Double) {
stormData.setMotionSpeed((Double) value);
} else {
/* Incompatible value indicates update from preference
* store. We will want to reload.
*/
stormTrackDirty = true;
}
}

View file

@ -98,6 +98,8 @@ import com.vividsolutions.jts.geom.LineString;
* 15Mar2013 15693 mgamazaychikov Made sure that magnification capability works.
* 06-11-2013 DR 16234 D. Friedman Fix pivot index when frames count is reduced.
* 06-24-2013 DR 16317 D. Friedman Handle "motionless" track.
* 01-28-2014 DR16465 mgamazaychikov Fixed the problem with anchor point when frame
* count changes; made line width configurable.
*
* </pre>
*
@ -408,13 +410,13 @@ public class StormTrackDisplay implements IRenderable {
// if mouseDownGeom set or not
RGB lineColor = state.mouseDownGeom != null ? LIGHT_GRAY : state.color;
// Paint the non dragging geom
paintLine(target, line.getCoordinates(), lineColor, state.isEditable(),
paintLine(target, line.getCoordinates(), lineColor, state.lineWidth, state.isEditable(),
circleSize, LineStyle.SOLID);
if (state.mouseDownGeom != null) {
// Paint the dragging geom
paintLine(target, state.mouseDownGeom.getCoordinates(),
state.color, state.isEditable(), circleSize,
state.color, state.lineWidth, state.isEditable(), circleSize,
LineStyle.DOTTED);
lineColor = LIGHT_GRAY;
}
@ -425,7 +427,7 @@ public class StormTrackDisplay implements IRenderable {
line,
gf.createPoint(state.futurePoints[state.futurePoints.length - 1].coord));
if (endLine != null) {
paintLine(target, endLine.getCoordinates(), lineColor, false,
paintLine(target, endLine.getCoordinates(), lineColor, state.lineWidth, false,
0, LineStyle.DASHED_LARGE);
}
}
@ -440,12 +442,13 @@ public class StormTrackDisplay implements IRenderable {
* coordinates in the line
* @param color
* color of the line
* @param lineWidth
* @param editable
* if the line is editable
* @throws VizException
*/
private void paintLine(IGraphicsTarget target, Coordinate[] coords,
RGB color, boolean editable, double circleSize, LineStyle style)
RGB color, float lineWidth, boolean editable, double circleSize, LineStyle style)
throws VizException {
DrawableCircle circle = new DrawableCircle();
circle.basics.color = color;
@ -474,7 +477,7 @@ public class StormTrackDisplay implements IRenderable {
lastCoord.x, lastCoord.y });
target.drawLine(p1[0], p1[1], 0.0, p2[0], p2[1], 0.0,
color, 1.0f, style);
color, lineWidth, style);
}
}
lastCoord = currCoord;
@ -716,6 +719,15 @@ public class StormTrackDisplay implements IRenderable {
|| currentState.newDuration != -1 || update) {
if (currentState.timePoints != null
&& currentState.timePoints.length != frameCount) {
// need to set theAnchorPoint and theAnchorIndex here
// because timePoints get erased before we get to updateAnchorPoint
DataTime frameTime = paintProps.getDataTime();
for (int j=0;j<currentState.timePoints.length;j++){
if (frameTime.equals(currentState.timePoints[j].time)) {
theAnchorPoint = currentState.timePoints[j].coord;
theAnchorIndex = j;
}
}
currentState.timePoints = null;
}

View file

@ -72,6 +72,9 @@ import com.raytheon.viz.ui.widgets.ToggleSelectList;
* Jan 9, 2013 15635 jdynina Allowed to mix and match entry dialogs. Changed order
* of dialogs to match A1 displaying entry fields first.
* Mar 29, 2013 1790 rferrel Bug fix for non-blocking dialogs.
* Oct 23, 2013 DR16203 equintin Restore the "-c" argument when the command
* for Png Images... is rebuilt after
* return from the dialog.
*
* </pre>
*
@ -84,7 +87,7 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
private final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ProductScriptsDialog.class);
private final int RUN_ID = IDialogConstants.CLIENT_ID + 1;
private String[] scripts;
@ -159,6 +162,7 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
Boolean run = false;
List<FieldDefinition> fieldDefs = new ArrayList<FieldDefinition>();
int start = 0;
int endIdx = -1;
String name = scriptsList.getItem(idx);
String cmd = scriptDict.get(name);
@ -205,7 +209,7 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
cmd = cmd.replace("{ztime}", curGMTTime);
cmd = cmd.replace("{home}", gfeHome);
cmd = cmd.replace("{prddir}", prddir);
// The user is prompted to enter the value with which to replace
// the
// following variables:
@ -224,6 +228,7 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
int entryIdx = cmd.indexOf("{entry:");
if (entryIdx >= 0) {
run = true;
int endEntryIdx = cmd.indexOf("}", entryIdx);
String[] entry = cmd.substring(entryIdx + 1, endEntryIdx)
.split(":");
@ -247,6 +252,10 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
} else if ((start > 0) && (start > entryIdx)) {
start = entryIdx;
}
if (entry[1].equals("ConfigFile")) { //DR 16203 eeq 10/23/2013
endIdx = endEntryIdx;
}
}
// The user is prompted for a list of radio button values.
@ -347,16 +356,21 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
if (dlgOpen <= 0) {
Map<Object, Object> map = scriptDlg.getValues();
String returnMsg = "";
for (Map.Entry<Object, Object> entry : map.entrySet()) {
returnMsg = returnMsg + entry.getValue().toString()
+ " ";
}
start = start - 3;
cmd = cmd.substring(0, start) + returnMsg;
}
if (endIdx > 0) {
cmd = cmd.replace(cmd.substring(start, endIdx+2), returnMsg);
} else {
start = start - 3;
cmd = cmd.substring(0, start) + returnMsg;
}
}
}
TaskManager.getInstance().createScriptTask(name, cmd);

View file

@ -83,6 +83,7 @@ import com.raytheon.viz.gfe.textformatter.TextFmtParserUtil;
* 30 APR 2013 16095 ryu Modified updateTextStyle() to not lock edited text.
* 29 AUG 2013 #2250 dgilling Better error handling for parseProductText().
* 04 SEP 2013 16534 ryu Fixed word wrap to not insert duplicate text; refactor.
* 20 DEC 2013 16854 ryu Force re-parsing of text on type change.
*
* </pre>
*
@ -578,21 +579,37 @@ public class StyledTextComp extends Composite {
} else {
String s = SPC + newfield;
if (!ff.getText().equals(s)) {
replaceText(ff, s);
replaceText(ff, s, true);
}
}
}
public void replaceText(TextIndexPoints tip, String text) {
replaceText(tip, text, false);
}
/**
* Replacement of the text in the given range with new text.
*
* @param tip
* the range of text to be replaced
* @param text
* the replacement text
* @param forceReparse
* if true, the product text will be forced to be re-parsed.
*/
public void replaceText(TextIndexPoints tip, String text,
boolean forceReparse) {
int start = prodDataStruct.positionToOffset(tip.getStartIndex());
if (!tip.getText().equals(text)) {
StyleRange[] ranges = textEditorST.getStyleRanges(start, tip
.getText().length());
textEditorST.replaceTextRange(start, tip.getText().length(), text);
// only reparse if we replaced with different length text
// only reparse if we replaced with different length text or forced
// else, replace StyleRanges since the operation is safe
if (tip.getText().length() != text.length()) {
if ((tip.getText().length() != text.length())
|| forceReparse) {
dirty = true;
} else {
for (StyleRange range : ranges) {

View file

@ -70,6 +70,9 @@ import com.raytheon.viz.gfe.temporaleditor.TemporalEditor;
* Apr 7, 2009 randerso Redesigned
* May 18, 2009 2159 rjpeter Added temporal editor.
* Jan 14, 2013 1442 rferrel Add SimulatedTimeChangeListener.
* Jan 15, 2014 16072 ryu Modify syncSelectTR() to skip the original code when
* called back from setSelectedTime().
*
* </pre>
*
* @author randerso
@ -78,6 +81,8 @@ import com.raytheon.viz.gfe.temporaleditor.TemporalEditor;
public class GridManager implements IGridManager,
ISpatialEditorTimeChangedListener {
private Date selectedTime = null;
private class RedrawRunnable implements Runnable {
@Override
@ -753,6 +758,8 @@ public class GridManager implements IGridManager,
@Override
public void setSelectedTime(Date selectedTime) {
// set attribute to check if we are calling back to syncSelectTR()
this.selectedTime = selectedTime;
dataManager.getSpatialDisplayManager().setSpatialEditorTime(
selectedTime);
redraw();
@ -766,32 +773,40 @@ public class GridManager implements IGridManager,
}
protected void syncSelectTR(Date t) {
// Use a selection tr of 1 hour duration if no active parm,
// if active parm and no grid, use the parm's time constraint,
// if active parm and grid, use the grid time.
if (lockSelectionTRtoTimeStep) {
TimeRange tr;
Parm parm = dataManager.getSpatialDisplayManager()
.getActivatedParm();
if (parm == null) {
Date tbase = new Date(
(t.getTime() / GridManagerUtil.MILLIS_PER_HOUR)
* GridManagerUtil.MILLIS_PER_HOUR);
tr = new TimeRange(tbase, GridManagerUtil.MILLIS_PER_HOUR);
} else {
GridID gridid = new GridID(parm, t);
if (gridid.grid() != null) {
tr = gridid.grid().getGridTime();
// setSelectedTime() will eventually call back to this method, in which case
// skip the original code (within the if block immediately below).
if (t.equals(selectedTime) == false) {
// Use a selection tr of 1 hour duration if no active parm,
// if active parm and no grid, use the parm's time constraint,
// if active parm and grid, use the grid time.
if (lockSelectionTRtoTimeStep) {
TimeRange tr;
Parm parm = dataManager.getSpatialDisplayManager()
.getActivatedParm();
if (parm == null) {
Date tbase = new Date(
(t.getTime() / GridManagerUtil.MILLIS_PER_HOUR)
* GridManagerUtil.MILLIS_PER_HOUR);
tr = new TimeRange(tbase, GridManagerUtil.MILLIS_PER_HOUR);
} else {
tr = parm.getGridInfo().getTimeConstraints()
.constraintTime(t);
GridID gridid = new GridID(parm, t);
if (gridid.grid() != null) {
tr = gridid.grid().getGridTime();
} else {
tr = parm.getGridInfo().getTimeConstraints()
.constraintTime(t);
}
dataManager.getParmOp().deselectAll();
parm.getParmState().setSelected(true);
}
dataManager.getParmOp().deselectAll();
parm.getParmState().setSelected(true);
dataManager.getParmOp().setSelectionTimeRange(tr);
}
dataManager.getParmOp().setSelectionTimeRange(tr);
}
else {
// reset
selectedTime = null;
}
}

View file

@ -62,6 +62,7 @@ import com.raytheon.viz.gfe.dialogs.TimeRangeWarningDialog;
* Nov 7, 2012 1298 rferrel Keep EmptyEditAreaWarningDialog blocking.
* Keep TimeRangeWarningdialog blocking.
* Jan 8, 2013 1486 dgilling Support changes to BaseGfePyController.
* Mar 14, 2014 15813 ryu Fixed default time range used.
*
* </pre>
*
@ -293,8 +294,7 @@ public class EditActionProcessor {
Date seTime = dataMgr.getSpatialDisplayManager()
.getSpatialEditorTime();
if (seTime != null) {
timeRange = new TimeRange(seTime, seTime.getTime()
+ (10 * 1000));
timeRange = new TimeRange(seTime, (10 * 1000));
}
}
}

View file

@ -80,6 +80,7 @@ import com.raytheon.viz.hydrocommon.util.HydroDialogStatus;
* Jan 27, 2011 #5274 bkowal Using the swt job class to request data
* asynchronously and display a progress
* indicator on the main interface.
* Feb 11, 2014 #15829 lbousaidi check for Missing before processing River Threat.
* </pre>
*
* @author mpduff
@ -390,6 +391,13 @@ public class PointDataControlManager extends Job {
* missing data are only added if requested, since it takes a finite
* time to determine which stations are missing.
*/
if (pcOptions.getSupressMissing() == 1) {
repList = PointDataControlAddMissing.addMissingReports(repList);
}
if (this.cancelJob) {
return;
}
/*
* Check to determine if the user wants the displayed river icons to
@ -406,24 +414,6 @@ public class PointDataControlManager extends Job {
return;
}
/*
* if the user has requested that a missing report be shown for each
* station being considered, then add them as necessary. the report
* list is passed in AND returned to handle the case where the
* report list may be empty, and therefore this function must assign
* a new Head pointer.
*
* missing data are only added if requested, since it takes a finite
* time to determine which stations are missing.
*/
if (pcOptions.getSupressMissing() == 1) {
repList = PointDataControlAddMissing.addMissingReports(repList);
}
if (this.cancelJob) {
return;
}
/*
* Check the "Values" pulldown option menu. Process the options
* according to the selected value which may be one of the
@ -1256,4 +1246,4 @@ public class PointDataControlManager extends Job {
this.cancel();
}
}
}
}

View file

@ -1,4 +1,4 @@
/**
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
@ -81,8 +81,9 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Oct 27,2011 11305 lbousaidi change some logic to have physical
* elements matches the selection of default limits
* Apr 19, 2013 1790 rferrel Make dialog non-blocking.
* Nov 26, 2013 15800 wkwock Fix unhandled event loop
* Jan 07, 2013 16643 snaples Fixed changeFormat to use string formatting instead of converting to Date.
* Mar 31, 2014 #2970 lvenable Put dispose checks in the runAsync calls.
*
* </pre>
*
* @author lvenable
@ -1296,21 +1297,13 @@ public class QcAlertAlarmLimitsDlg extends CaveSWTDialog {
private String changeFormat(String initDateFormat, SimpleDateFormat dateF1,
SimpleDateFormat dateF2) {
String finalDateFormat = null;
Date dd1 = null;
if ((initDateFormat != null) && !(initDateFormat.equals(""))) {
try {
dateF1.setLenient(false);
dateF2.setLenient(false);
dd1 = dateF1.parse(initDateFormat);
} catch (ParseException e) {
statusHandler.handle(Priority.PROBLEM, "Error parsing data. ",
e);
}
finalDateFormat = dateF2.format(dd1);
String dateformat1 = dateF1.toPattern();
String dateformat2 = dateF2.toPattern();
char ch1 = dateformat1.charAt(2);
char ch2 = dateformat2.charAt(2);
finalDateFormat = initDateFormat.replace(ch1, ch2);
}
@ -1339,7 +1332,23 @@ public class QcAlertAlarmLimitsDlg extends CaveSWTDialog {
if (success) {
// Reload the data keeping the selection
selection = limitsList.getSelectionIndex();
String currentItem=locationSelItemTF.getText();
loadData(true);
if (selection<0) {//must be new item
int index = 0 ;
for (index=0; index<limitsList.getItemCount();index++) {
String item = limitsList.getItem(index);
if (item.trim().split(" ")[0].compareToIgnoreCase(currentItem)==0)
break; //found the index
}
if (index>=limitsList.getItemCount())
selection=0;
else
selection = index;
}
limitsList.setSelection(selection);
getSelectedLimit();
}

View file

@ -48,6 +48,7 @@ import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 20, 2010 1783 mpduff Initial creation.
* Jan 07, 2014 16578 snaples Updated initInternal line array to handle area where it is wider than tall.
* Mar 31, 2014 2689 mpduff Fixed error introduced during a previous code change.
*
* </pre>
@ -90,9 +91,9 @@ public class HRAPOverlayResource extends
int minY = ge.getLow(1);
int height = ge.getSpan(1) + 1;
for (int x = 0; x < width; ++x) {
for (int x = 0; x < width; x++) {
double[][] line = new double[height][];
for (int y = 0; y < height; ++y) {
for (int y = 0; y < height; y++) {
double[] out = new double[2];
mt.transform(new double[] { minX + x, minY + y }, 0, out,
0, 1);
@ -101,9 +102,9 @@ public class HRAPOverlayResource extends
grid.addLineSegment(line);
}
for (int y = 0; y < height; ++y) {
for (int y = 0; y < height; y++) {
double[][] line = new double[width][];
for (int x = 0; x < width; ++x) {
for (int x = 0; x < width; x++) {
double[] out = new double[2];
mt.transform(new double[] { minX + x, minY + y }, 0, out,
0, 1);

View file

@ -34,6 +34,8 @@ import com.raytheon.uf.common.ohd.AppsDefaults;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 9, 2008 1194 mpduff Initial creation.
* Mar 7, 2014 16692 lbousaidi Any Forecast source other than
* H*,P*,Q*,T* should be handled by fcstother.
*
* </pre>
*
@ -110,6 +112,9 @@ public class DbUtils {
* data
*/
retVal = fcstTableMap.get(pe.substring(0, 1).toLowerCase());
if (retVal==null) {
retVal="Fcstother";
}
matchFound = true;
} else { /* if type-source not valid */
// TODO - Log error message - "Invalid type-source specified for

View file

@ -103,6 +103,8 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
* Apr 18, 2013 1920 mpduff Added updateGages method to reload the gage data,
* fix formatting of legend for Base field Height.
* Jul 02, 2013 2160 mpduff Initialize newly displayed resources.
* Feb 02, 2014 16201 snaples Added saved data flag support
* Feb 04, 2014 16410 lbousaidi changed the first letter of the month to lower case.
* Feb 19, 2014 2628 mpduff Change cast from short to int when creating color bar.
*
* </pre>
@ -208,6 +210,8 @@ public class MPEDisplayManager {
private AbstractVizResource<?, ?> displayedResource;
private boolean savedData = true;
public void setDisplayedResource(AbstractVizResource<?, ?> rsc) {
displayedResource = rsc;
if (displayedFieldResource != null
@ -223,11 +227,11 @@ public class MPEDisplayManager {
* @return the dataSaved
*/
public boolean isDataSaved() {
// TODO: Does A1 MPE EVER have a time where you change edit dates and it
// doesn't prompt? If so, we need to check here if data is saved or not
// TODO: Also, any editing methods need to change displayed frame to
// stop looping so they can see what they are editing.
return false;
return savedData;
}
public void setSavedData(boolean saved) {
savedData = saved;
}
/**
@ -431,8 +435,15 @@ public class MPEDisplayManager {
}
editTime = getCurrentDisplayedDate();
displayedField = DisplayFieldData.mMosaic;
// token for default display
String mdd = AppsDefaults.getInstance().getToken("mpe_def_display");
if(mdd != null){
displayedField = DisplayFieldData.fromString(mdd);
} else {
displayedField = DisplayFieldData.fromString("MMOSAIC");
}
ChangeTimeProvider.update(this);
VizApp.runAsync(new Runnable() {
@ -956,6 +967,7 @@ public class MPEDisplayManager {
String fname = null;
if (prismType != null) {
// Load prism type
dateString= dateString.toLowerCase();
String mpe_site_id = appsDefaults.getToken("mpe_site_id");
fname = FileUtil.join(dirname, "prism_" + prismType + "_"
+ mpe_site_id + "_" + dateString);

View file

@ -56,6 +56,7 @@ import com.raytheon.viz.mpe.ui.MPEDisplayManager;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Dec 11, 2012 mschenke Initial creation
* Feb 2, 2014 16201 snaples Added saved data flag support
*
* </pre>
*
@ -263,6 +264,7 @@ public class SaveBestEstimate {
// "%s\n", command_string ));
// system ( command_string );
}
MPEDisplayManager.getCurrent().setSavedData(true);
}
private static void mpegui_save_image(BufferedImage bi, String format,

View file

@ -61,6 +61,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 8, 2009 snaples Initial creation
* Feb 2, 2014 16201 snaples Added saved data flag support
*
* </pre>
*
@ -92,6 +93,8 @@ public class AddPseudoGageDialog extends CaveSWTDialog {
private MPEGageResource resource;
private MPEDisplayManager mgr;
private static final String psstr = "PSEUDO";
/**
@ -124,7 +127,8 @@ public class AddPseudoGageDialog extends CaveSWTDialog {
@Override
protected void initializeComponents(Shell shell) {
font = new Font(shell.getDisplay(), "Courier", 10, SWT.NORMAL);
datetime = MPEDisplayManager.getCurrent().getCurrentEditDate();
mgr = MPEDisplayManager.getCurrent();
datetime = mgr.getCurrentEditDate();
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
@ -219,6 +223,7 @@ public class AddPseudoGageDialog extends CaveSWTDialog {
@Override
public void widgetSelected(SelectionEvent e) {
writePGage();
mgr.setSavedData(false);
close();
}
});

View file

@ -74,6 +74,8 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* Jun 05, 2013 15961 lbousaidi added routines for set Bad/set not bad buttons
* to reflect the state of the gages.
* Jul 02, 2013 2160 mpduff Changed to not call deprecated resource.getData() method.
* Feb 2, 2014 16201 snaples Added saved data flag support
*
* </pre>
*
* @author randerso
@ -155,10 +157,12 @@ public class Display7x7Dialog extends CaveSWTDialog {
private DisplayFieldData selectedFieldData;
private static boolean oldManedit = false;
private MPEDisplayManager mgr;
public Display7x7Dialog(Shell parentShell, MPEGageData data) {
super(parentShell, SWT.DIALOG_TRIM, CAVE.DO_NOT_BLOCK);
setText("Display 7 X 7 Gage Editing Utility");
mgr = MPEDisplayManager.getCurrent();
selectedGage = data;
gData = MPEDataManager.getInstance().getEditedGage(selectedGage);
ArrayList<String> bg = MPEDataManager.getInstance().readBadGageList();
@ -488,6 +492,7 @@ public class Display7x7Dialog extends CaveSWTDialog {
undoMissing.setEnabled(undoEn);
String wid = workingGage.getId();
editGage.put(wid, workingGage);
mgr.setSavedData(false);
if (!editGage.isEmpty()) {
Iterator<MPEGageData> x = editGage.values().iterator();
@ -578,6 +583,7 @@ public class Display7x7Dialog extends CaveSWTDialog {
MPEGageData gd = x.next();
MPEDataManager.getInstance().addEditedGage(gd);
}
mgr.setSavedData(false);
}
}
});
@ -678,6 +684,7 @@ public class Display7x7Dialog extends CaveSWTDialog {
if ((!notBadGage.isEmpty() || !badGage.isEmpty())
&& !editGage.isEmpty()) {
MPEDataManager.getInstance().writeBadGageList();
}
}
});
@ -938,7 +945,6 @@ public class Display7x7Dialog extends CaveSWTDialog {
}
private void updateGridField(DisplayFieldData fieldType) {
MPEDisplayManager mgr = MPEDisplayManager.getCurrent();
if (selectedFieldData != fieldType) {
selectedFieldData = fieldType;
mgr.displayFieldData(fieldType);

View file

@ -69,6 +69,8 @@ import com.raytheon.viz.mpe.ui.radartable.ReadBiasTableParam;
* Jul 14, 2009 snaples Initial creation
* Jun 18, 2013 16053 snaples Removed reference to setRadarEditFlag
* Aug 06, 2013 16243 Changed the Gui to a ScrolledComposite.
* Feb 2, 2014 16201 snaples Added saved data flag support
*
* </pre>
*
* @author snaples
@ -251,6 +253,8 @@ public class RadarBiasTableDialog extends Dialog {
@Override
public void widgetSelected(SelectionEvent e) {
applyBiasUpdate(dt);
MPEDisplayManager mgr = MPEDisplayManager.getCurrent();
mgr.setSavedData(false);
shell.dispose();
}
});

View file

@ -103,6 +103,8 @@ import com.raytheon.viz.mpe.ui.dialogs.gagetable.xml.GageTableSortType;
* ------------ ---------- ----------- --------------------------
* May 28, 2009 2476 mpduff Initial creation.
* Mar 08, 2013 15725 snaples Updated to fix resort issues when editing value.
* Jan 28, 2014 16994 snaples Updated populateGridCombo to get correct filename prefix for matching up selection.
* Feb 2, 2014 16201 snaples Added saved data flag support
*
* </pre>
*
@ -487,7 +489,7 @@ public class GageTableDlg extends JFrame implements IEditTimeChangedListener {
if (columnData.get(i).isDataColumn()) {
gridCombo.addItem(columnData.get(i).getName());
if (selectedGrid
.equalsIgnoreCase(columnData.get(i).getPrefix())) {
.equalsIgnoreCase(columnData.get(i).getProductDescriptor().getProductFilenamePrefix())) {
gridComboSelection = gridSelectionIndex;
}
gridSelectionIndex++;
@ -525,6 +527,7 @@ public class GageTableDlg extends JFrame implements IEditTimeChangedListener {
@Override
public void actionPerformed(ActionEvent e) {
saveChanges();
displayManager.setSavedData(false);
}
});

View file

@ -58,6 +58,9 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
* with the "scale" action will no
* longer be divided by 100.
* Sep 11, 2013 #2353 lvenable Fixed cursor memory leak.
* Jan 29, 2014 16561 snaples Updated processDrawPrecipValue to remove polygon wireframe after setting value.
* Feb 2, 2014 16201 snaples Added saved data flag support
*
*
* </pre>
*
@ -739,6 +742,8 @@ public class DrawPolygonDlg extends CaveSWTDialog {
polygonEdits.add(newEdit);
PolygonEditManager.writePolygonEdits(displayedField, editDate,
polygonEdits);
resource.clearPolygons();
dispMgr.setSavedData(false);
} finally {
shell.setCursor(prevCursor);
}

View file

@ -77,6 +77,8 @@ import com.vividsolutions.jts.geom.GeometryFactory;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 28, 2009 snaples Initial creation
* Dec 23, 2013 16329 snaples Added target assignment to paintInternal().
*
*
* </pre>
*
@ -359,6 +361,8 @@ public class DisplayMeanArealPrecipResource extends
}
Set<DisplayMode> mode = displayMgr.getDisplayMode();
target = aTarget;
if (mode.contains(DisplayMode.Image)) {
if (gridDisplay == null) {

View file

@ -79,7 +79,10 @@ import com.raytheon.viz.mpe.ui.rsc.MPEFieldResourceData.MPEFieldFrame;
* hour less than the file time stamp.
* Jul 02, 2013 2160 mpduff Changed how edited data are called for return.
* Sep 17, 2013 16563 snaples Updated createFrameImage to handle trace precip
* properly when mapping to screen.
* properly when mapping to screen.
* Mar 10, 2014 17059 snaples Added case for Prism data for unit conversion correction.
* Mar 19, 2014 17109 snaples Removed code that added an hour to SATPRE, the base file reference time has been adjusted.
*
* </pre>
*
* @author mschenke
@ -324,12 +327,6 @@ public class MPEFieldResource extends
timeToLoad.setTime(currTime.getRefTime());
timeToLoad.add(Calendar.HOUR, -i);
if (displayField == DisplayFieldData.satPre) {
// SATPRE MPE file time stamp is the start time of the hour
// i.e. a 12z -13z product has a time stamp of 12z.
timeToLoad.add(Calendar.HOUR, -1);
}
XmrgFile file = MPEDisplayManager.getXmrgFile(displayField,
timeToLoad.getTime());
try {
@ -435,6 +432,17 @@ public class MPEFieldResource extends
}
}
break;
case Prism:
for (int i = 0; i < length; ++i) {
short value = data[i];
if (value < 0) {
imageData[i] = 0;
} else {
imageData[i] = (short) dataToImage.convert(value);
}
}
break;
default :
for (int i = 0; i < length; ++i) {

View file

@ -22,6 +22,7 @@ package com.raytheon.viz.mpe.util;
import java.io.File;
import java.io.IOException;
import javax.measure.converter.UnitConverter;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import javax.measure.unit.Unit;
@ -85,9 +86,10 @@ public class MeanMonthlyPrecip {
Unit<?> dataUnit = Unit.ONE;
displayUnit = NonSI.INCH;
dataUnit = NonSI.INCH;
dataUnit = SI.MILLIMETER;
cmc.setDisplayUnit(displayUnit);
cmc.setDataUnit(dataUnit);
UnitConverter dataToImage = cmc.getDataToImageConverter();
/*
* Loop over the months. Determine for which months PRISM data are
@ -142,23 +144,11 @@ public class MeanMonthlyPrecip {
for (int i = MaxY - 1; i >= 0; i--) {
for (int j = 0; j < MaxX; j++) {
float f = 0;
short s= pdata[j + MaxX * (MaxY - i -1)];
short s = pdata[j + MaxX * (MaxY - i -1)];
if (s < 0) {
if (s == -9999 || s == -999 || s == -99 || (s == -9)) {
f = s;
} else if (s == -8888 || s == -899) {
f = s;
} else {
f = (float) cmc.getDataToDisplayConverter()
.convert(s);
}
f = 0;
} else {
if (s < 30 && s > 24) {
s = 26;
} else if (s > 0 && s <= 24) {
s = 0;
}
f = (float) cmc.getDataToDisplayConverter().convert(s);
f = (float) dataToImage.convert(s);
}
float aa = (float) ((Math.floor((int) (f * 100))) / 100.0);
isoh.value[k][i][j] = (int) aa;

View file

@ -334,6 +334,7 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox;
* 20Sep2013 #2394 lvenable Fixed color memory leaks.
* 20Nov2013 DR 16777 D. Friedman Check if OUPRequest will work before setting ETN.
* 10Dec2013 2601 mpduff Fix NullPointerException.
* 28Jan2014 DR14595 mgamazaychikov Added template loading and editing functionality.
* 14Mar2014 DR 17175 D. Friedman Get correct time zone for MND header time sync.
* </pre>
*
@ -1088,6 +1089,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
* Search and replace dialog.
*/
private SearchReplaceDlg searchReplaceDlg;
/**
* Flag indicating if the overwrite mode has been set for
* template editing.
*/
private boolean isTemplateOverwriteModeSet = false;
/**
* Flag to indicate if the document being edited has been saved.
@ -2052,14 +2059,16 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
overStrikeItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if (overwriteMode == true) {
overwriteMode = false;
editorInsertCmb.select(INSERT_TEXT);
} else {
overwriteMode = true;
editorInsertCmb.select(OVERWRITE_TEXT);
if (!AFOSParser.isTemplate) {
if (overwriteMode == true) {
overwriteMode = false;
editorInsertCmb.select(INSERT_TEXT);
} else {
overwriteMode = true;
editorInsertCmb.select(OVERWRITE_TEXT);
}
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
}
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
}
});
}
@ -3699,18 +3708,20 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
editorInsertCmb.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if ((editorInsertCmb.getSelectionIndex() == INSERT_TEXT)
&& (overwriteMode == true)) {
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
overwriteMode = false;
overStrikeItem.setSelection(false);
} else if ((editorInsertCmb.getSelectionIndex() == OVERWRITE_TEXT)
&& (overwriteMode == false)) {
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
overwriteMode = true;
overStrikeItem.setSelection(true);
if (!AFOSParser.isTemplate) {
if (editorInsertCmb.getSelectionIndex() == INSERT_TEXT
&& overwriteMode == true) {
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
overwriteMode = false;
overStrikeItem.setSelection(false);
} else if (editorInsertCmb.getSelectionIndex() == OVERWRITE_TEXT
&& overwriteMode == false) {
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
overwriteMode = true;
overStrikeItem.setSelection(true);
}
textEditor.setFocus();
}
textEditor.setFocus();
}
});
@ -3870,16 +3881,18 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
event.doit = false; // Ignore Ctrl+Shift+PageDown
} else if (event.keyCode == SWT.INSERT) {
// Ins key on the keypad
if (overwriteMode == true) {
overwriteMode = false;
overStrikeItem.setSelection(false);
editorInsertCmb.select(INSERT_TEXT);
} else {
overwriteMode = true;
overStrikeItem.setSelection(true);
editorInsertCmb.select(OVERWRITE_TEXT);
if (AFOSParser.isTemplate) {
if (overwriteMode == true) {
overwriteMode = false;
overStrikeItem.setSelection(false);
editorInsertCmb.select(INSERT_TEXT);
} else {
overwriteMode = true;
overStrikeItem.setSelection(true);
editorInsertCmb.select(OVERWRITE_TEXT);
}
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
}
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
} else if (event.keyCode > 500) {
// Do nothing...
// We need to capture the non-alphanumeric editing-related
@ -3893,6 +3906,71 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
&& (event.character != '\n')) {
userKeyPressed = true;
}
if (AFOSParser.isTemplate) {
if (event.keyCode == SWT.BS) {
event.doit = false;
int currentPos = textEditor.getCaretOffset();
String textUpToCaret = textEditor.getText().substring(0, currentPos);
int leftMost=textUpToCaret.lastIndexOf("[") + 1;
int rightMost = textEditor.getText().indexOf("]",currentPos);
int editableTextWidth = rightMost - leftMost;
String leftPart="";
String rightPart="";
if (currentPos == leftMost) {
leftPart = "";
rightPart = textEditor.getText().substring(
currentPos, rightMost);
textEditor.setCaretOffset(leftMost);
}
else if (currentPos > leftMost && currentPos <= rightMost){
leftPart = textEditor.getText().substring(
leftMost, currentPos - 1);
rightPart = textEditor.getText().substring(
currentPos, rightMost);
}
else if (currentPos == rightMost) {
leftPart = textEditor.getText().substring(
leftMost, currentPos-1);
rightPart = "";
}
String newString = leftPart + rightPart;
int width = newString.length();
int neededPadSpaces = editableTextWidth - newString.length();
String newPaddedString = String.format("%1$-"
+ (neededPadSpaces+1) + "s", newString);
String spacedoutString = String.format("%1$-"
+ (editableTextWidth) + "s",
" ");
textEditor.replaceTextRange(leftMost,
spacedoutString.length(), spacedoutString);
textEditor.replaceTextRange(leftMost,
newPaddedString.length(), newPaddedString);
textEditor.setCaretOffset(currentPos - 1);
} else if (event.keyCode == SWT.TAB) {
if (!isTemplateOverwriteModeSet) {
if (overwriteMode) {
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
} else {
}
isTemplateOverwriteModeSet = true;
}
event.doit = false;
int currentPos = textEditor.getCaretOffset();
String textUpToCaret = textEditor.getText().substring(
0, currentPos);
int openBracketPos = textUpToCaret.lastIndexOf("[");
openBracketPos = textEditor.getText().indexOf("[", currentPos);
textEditor.setCaretOffset(openBracketPos + 1);
}
else if (event.keyCode>=97 && event.keyCode <=122 ||
event.keyCode>=48 && event.keyCode <=57){
event.doit = true;
}
}
}
});
@ -4077,6 +4155,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
* Enter the text editor mode.
*/
private void enterEditor() {
initTemplateOverwriteMode();
StdTextProduct product = TextDisplayModel.getInstance()
.getStdTextProduct(token);
if ((product != null)
@ -5120,6 +5199,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
body.append("\n");
}
body.append(textEditor.getText().trim());
if (AFOSParser.isTemplate){
return removePreformat(body.toString());
}
return body.toString();
}
@ -5250,6 +5333,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
productText += ATTACHMENT_STR
+ statusBarLabel.getText().substring(startIndex);
}
if (AFOSParser.isTemplate) {
productText = removePreformat(productText);
}
storedProduct.setProduct(productText.trim());
@ -6853,7 +6940,9 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
}
String textProduct = product.getASCIIProduct();
if ((product.getNnnid() + product.getXxxid())
.startsWith(AFOSParser.DRAFT_PIL)) {
.startsWith(AFOSParser.DRAFT_PIL) ||
(product.getNnnid() + product.getXxxid())
.startsWith(AFOSParser.MCP_NNN )) {
String[] nnnxxx = TextDisplayModel.getNnnXxx(textProduct);
String operationalPil = nnnxxx[0] + nnnxxx[1];
String siteNode = SiteAbbreviationUtil.getSiteNode(nnnxxx[1]);
@ -8497,4 +8586,46 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
return bbb;
}
}
private void initTemplateOverwriteMode() {
if (AFOSParser.isTemplate) {
editorInsertCmb.setEnabled(false);
editorCutBtn.setEnabled(false);
editorCopyBtn.setEnabled(false);
editorPasteBtn.setEnabled(false);
editorFillBtn.setEnabled(false);
editorAttachBtn.setEnabled(false);
overStrikeItem.setEnabled(false);
if (!isTemplateOverwriteModeSet) {
if (overwriteMode) {
} else {
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
}
isTemplateOverwriteModeSet = true;
}
}
else {
editorInsertCmb.setEnabled(true);
overStrikeItem.setEnabled(true);
editorCutBtn.setEnabled(true);
editorCopyBtn.setEnabled(true);
editorPasteBtn.setEnabled(true);
editorFillBtn.setEnabled(true);
editorAttachBtn.setEnabled(true);
if (isTemplateOverwriteModeSet && !overwriteMode){
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
isTemplateOverwriteModeSet=false;
}
if (!isTemplateOverwriteModeSet && overwriteMode){
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
}
}
}
private String removePreformat(String preformattedText) {
String modifiedText = preformattedText.replaceAll("\\[|\\]", " ");
modifiedText = removeSoftReturns(modifiedText);
return modifiedText;
}
}

View file

@ -34,7 +34,9 @@ import java.util.regex.Pattern;
* Aug 25, 2011 10719 rferrel Removed the no longer common ugcPtrn.
* Aug 6, 2012 15219 Qinglu Lin For tmlPtrn, changed d{1,3}DEG to d{3}DEG.
* May 1, 2013 15893 mgamazaychikov Changed listOfAreaNamePtrn.
* Feb 26, 2014 16386 Qinglu Lin Updated listOfAreaNamePtrn to handle issue caused by
* hyphens in county name, and that by "'" and "/" as well.
*
* </pre>
*
* @version 1.0
@ -57,7 +59,7 @@ public interface IQCCheck {
.compile("/[A-Za-z0-9]{5}.[0-3NU].(\\w{2}).\\d{6}T\\d{4}Z.\\d{6}T\\d{4}Z.\\d{6}T\\d{4}Z.\\w{2}/");
public static final Pattern listOfAreaNamePtrn = Pattern
.compile("^(\\w{1,}\\s{1}[\\w{1,}\\s{1}]*-{1,})");
.compile("^([\\w\\s\\.'/]*-)");
public static final Pattern firstBulletPtrn = Pattern
.compile("\\*\\s(.*)\\s(WARNING|ADVISORY)(\\sFOR(.*)|...)");

View file

@ -79,6 +79,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
* 10/01/2013 DR 16632 Qinglu Lin Fixed the bug in for loop range.
* 10/17/2013 DR 16632 Qinglu Lin Updated removeOverlaidLinesegments().
* 10/18/2013 DR 16632 Qinglu Lin Catch exception thrown when coords length is less than 4 and doing createLinearRing(coords).
* 12/17/2013 DR 16567 Qinglu Lin Added createPolygonByPoints().
* 01/09/2014 DR 16974 D. Friedman Improve followup redraw-from-hatched-area polygons.
* </pre>
*
@ -1562,4 +1563,24 @@ public class PolygonUtil {
}
return slope;
}
/**
* Create a polygon whose two diagonal coordinates are a and b.
**/
static public Geometry createPolygonByPoints(Coordinate a, Coordinate b) {
double maxX, minX, maxY, minY;
maxX = Math.max(a.x, b.x);
minX = Math.min(a.x, b.x);
maxY = Math.max(a.y, b.y);
minY = Math.min(a.y, b.y);
Coordinate[] coord = new Coordinate[5];
coord[0] = new Coordinate(minX, minY);
coord[1] = new Coordinate(maxX, minY);
coord[2] = new Coordinate(maxX, maxY);
coord[3] = new Coordinate(minX, maxY);
coord[4] = new Coordinate(coord[0]);
GeometryFactory gf = new GeometryFactory();
LinearRing lr = gf.createLinearRing(coord);
return gf.createPolygon(lr, null);
}
}

View file

@ -95,6 +95,10 @@ import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.localization.LocalizationManager;
import com.raytheon.uf.viz.core.map.MapDescriptor;
import com.raytheon.uf.viz.core.maps.MapManager;
import com.raytheon.uf.viz.core.notification.INotificationObserver;
import com.raytheon.uf.viz.core.notification.NotificationException;
import com.raytheon.uf.viz.core.notification.NotificationMessage;
import com.raytheon.uf.viz.core.notification.jobs.NotificationManagerJob;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.ResourceProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability;
@ -195,8 +199,16 @@ import com.vividsolutions.jts.io.WKTReader;
* Use A1 hatching behavior when no county passes the inclusion filter.
* 10/29/2013 DR 16734 D. Friedman If redraw-from-hatched-area fails, don't allow the pollygon the be used.
* 12/04/2013 2604 jsanchez Refactored GisUtil.
* 12/17/2013 DR 16567 Qinglu Lin Added findLargestGeometry() and findLargestQuadrant(), and updated
* populateStrings() and paintText().
* 01/09/2014 DR 16974 D. Friedman Improve followup redraw-from-hatched-area polygons.
* 02/07/2014 DR16090 m.gamazaychikov Added GeomMetaDataUpdateNotificationObserver class to get notification
* when geometry file get updated to re-read them in.
* 02/19/2014 2819 randerso Removed unnecessary .clone() call
* 03/17/2014 DR16309 Qinglu Lin Updated getWarningAreaFromPolygon(); changed searchCountyGeospatialDataAccessor) to
* searchGeospatialDataAccessor() and updated it; changed getCountyGeospatialDataAcessor()
* to getGeospatialDataAcessor(); changed getAllCountyUgcs() to getAllUgcs(); changed
* getUgcsForWatches() to getUgcsForCountyWatches().
* </pre>
*
* @author mschenke
@ -545,6 +557,56 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
private static class GeomMetaDataUpdateNotificationObserver implements INotificationObserver {
private static final String SHAPEFILE_UPDATE_TOPIC = "edex.geospatialUpdate.msg";
private static GeomMetaDataUpdateNotificationObserver instance = null;
static WarngenLayer warngenLayer;
private GeomMetaDataUpdateNotificationObserver() {
}
public static synchronized GeomMetaDataUpdateNotificationObserver getInstance(WarngenLayer wl) {
if (instance == null) {
instance = new GeomMetaDataUpdateNotificationObserver();
NotificationManagerJob.addObserver(SHAPEFILE_UPDATE_TOPIC, instance);
warngenLayer = wl;
}
return instance;
}
/**
* Remove the alert message observer from the Notification Manager Job
* listener.
*/
public static synchronized void removeNotificationObserver() {
if (instance != null) {
NotificationManagerJob.removeObserver(SHAPEFILE_UPDATE_TOPIC, instance);
instance = null;
}
}
@Override
public void notificationArrived(NotificationMessage[] messages) {
for (NotificationMessage message : messages) {
try {
Object payload = message.getMessagePayload();
if (payload instanceof String ) {
System.out.println("Geometry Metadata has been updated based on " + payload + " shapefile data");
warngenLayer.siteMap.clear();
warngenLayer.init(warngenLayer.configuration);
}
} catch (NotificationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private static Map<String, GeospatialDataList> siteMap = new HashMap<String, GeospatialDataList>();
private static Map<String, Geometry> timezoneMap = new HashMap<String, Geometry>();
@ -608,6 +670,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
private WarningAction warningAction = WarningAction.NEW;
private GeomMetaDataUpdateNotificationObserver geomUpdateObserver;
static {
for (int i = 0; i < 128; i++) {
if ((i % 32) == 0) {
@ -760,6 +824,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
protected void disposeInternal() {
customMaps.clearMaps();
GeomMetaDataUpdateNotificationObserver.removeNotificationObserver();
super.disposeInternal();
synchronized (WarngenLayer.class) {
@ -965,11 +1031,11 @@ public class WarngenLayer extends AbstractStormTrackResource {
double ratio = paintProps.getView().getExtent().getWidth()
/ paintProps.getCanvasBounds().width;
double minX = paintProps.getView().getExtent().getMinX();
double maxX = paintProps.getView().getExtent().getMaxX();
double minY = paintProps.getView().getExtent().getMinY();
double maxY = paintProps.getView().getExtent().getMaxY();
double boundary = 40 * ratio;
double minX = paintProps.getView().getExtent().getMinX() + boundary;
double maxX = paintProps.getView().getExtent().getMaxX() - boundary;
double minY = paintProps.getView().getExtent().getMinY() + boundary;
double maxY = paintProps.getView().getExtent().getMaxY() - boundary;
List<DrawableString> strings = new ArrayList<DrawableString>();
if ((state.strings != null) && (state.strings.size() > 0)) {
Iterator<Coordinate> coords = state.strings.keySet().iterator();
@ -982,14 +1048,14 @@ public class WarngenLayer extends AbstractStormTrackResource {
in[2] = c.z;
double[] out = this.descriptor.worldToPixel(in);
if (out[0] > maxX) {
out[0] = maxX;
out[0] = maxX - boundary;
} else if (out[0] < minX) {
out[0] = minX;
out[0] = minX + boundary;
}
if (out[1] > maxY) {
out[1] = maxY;
out[1] = maxY - boundary;
} else if (out[1] < minY) {
out[1] = minY;
out[1] = minY + boundary;
}
DrawableString string = new DrawableString(text, textColor);
string.magnification = magnification;
@ -1055,6 +1121,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
String site = getLocalizedSite();
initializeGeomUpdateObserver();
synchronized (siteMap) {
loadGeodataForConfiguration(config);
@ -1079,6 +1147,12 @@ public class WarngenLayer extends AbstractStormTrackResource {
+ (System.currentTimeMillis() - t0) + "ms");
}
private void initializeGeomUpdateObserver() {
if (geomUpdateObserver == null) {
geomUpdateObserver= GeomMetaDataUpdateNotificationObserver.getInstance(this);
}
}
/**
* Adds geospatial data to siteMap and timezoneMap for the given template
* configuration. This must not have any site effects on the currently
@ -1347,8 +1421,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
*/
public Geometry getWarningAreaFromPolygon(Polygon polygon,
AbstractWarningRecord record) {
Map<String, String[]> countyMap = FipsUtil.parseCountyHeader(record
.getCountyheader());
Map<String, String[]> countyMap = FipsUtil.parseHeader(record
.getCountyheader(), "County");
try {
return getArea(polygon, countyMap);
} catch (Exception e) {
@ -1361,35 +1435,53 @@ 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)
public Set<String> getUgcsForWatches(Polygon polygon)
throws Exception {
GeospatialDataAccessor gda = getCountyGeospatialDataAcessor();
GeospatialDataAccessor gda = getGeospatialDataAcessor();
boolean isMarineZone = configuration.getGeospatialConfig()
.getAreaSource().equalsIgnoreCase(MARINE);
if (!isMarineZone) {
Set<String> ugcs = new HashSet<String>();
for (String fips : gda.getAllFipsInArea(gda.buildArea(polygon))) {
ugcs.add(FipsUtil.getUgcFromFips(fips));
}
return ugcs;
} else {
Set<String> ids = new HashSet<String>();
Geometry g = gda.buildArea(polygon);
ids = getAllFipsInArea(g);
return ids;
}
}
public Set<String> getAllUgcs() throws Exception {
GeospatialDataAccessor gda;
Set<String> ugcs = new HashSet<String>();
for (String fips : gda.getAllFipsInArea(gda.buildArea(polygon))) {
ugcs.add(FipsUtil.getUgcFromFips(fips));
gda = getGeospatialDataAcessor();
boolean isMarineZone = configuration.getGeospatialConfig()
.getAreaSource().equalsIgnoreCase(MARINE);
if (!isMarineZone) {
for (GeospatialData r : gda.geoData.features) {
ugcs.add(FipsUtil.getUgcFromFips(gda.getFips(r)));
}
} else {
for (GeospatialData r : gda.geoData.features) {
ugcs.add(getFips(r));
}
}
return ugcs;
}
public Set<String> getAllCountyUgcs() throws Exception {
GeospatialDataAccessor gda = getCountyGeospatialDataAcessor();
Set<String> ugcs = new HashSet<String>();
for (GeospatialData r : gda.geoData.features) {
ugcs.add(FipsUtil.getUgcFromFips(gda.getFips(r)));
}
return ugcs;
}
private GeospatialDataAccessor getCountyGeospatialDataAcessor()
private GeospatialDataAccessor getGeospatialDataAcessor()
throws Exception {
GeospatialDataList gdl = searchCountyGeospatialDataAccessor();
GeospatialDataList gdl = searchGeospatialDataAccessor();
if (gdl == null) {
// Cause county geospatial data to be loaded
// TODO: Should not be referencing tornadoWarning.
WarngenConfiguration torConfig = WarngenConfiguration.loadConfig(
"tornadoWarning", getLocalizedSite());
loadGeodataForConfiguration(torConfig);
gdl = searchCountyGeospatialDataAccessor();
gdl = searchGeospatialDataAccessor();
}
// TODO: There should be some way to get the "county" configuration by
@ -1401,13 +1493,21 @@ public class WarngenLayer extends AbstractStormTrackResource {
return new GeospatialDataAccessor(gdl, areaConfig);
}
private GeospatialDataList searchCountyGeospatialDataAccessor() {
private GeospatialDataList searchGeospatialDataAccessor() {
synchronized (siteMap) {
for (Map.Entry<String, GeospatialDataList> entry : siteMap
.entrySet()) {
String[] keyParts = entry.getKey().split("\\.");
boolean isMarineZone = configuration.getGeospatialConfig()
.getAreaSource().equalsIgnoreCase(MARINE);
String mapdataTable = null;
if (!isMarineZone) {
mapdataTable = "county";
} else {
mapdataTable = "marinezones";
}
if ((keyParts.length == 2)
&& "county".equalsIgnoreCase(keyParts[0])
&& mapdataTable.equalsIgnoreCase(keyParts[0])
&& getLocalizedSite().equals(keyParts[1])) {
return entry.getValue();
}
@ -3019,10 +3119,52 @@ public class WarngenLayer extends AbstractStormTrackResource {
for (GeospatialData f : geoData.features) {
Geometry geom = f.geometry;
if (prefixes.contains(GeometryUtil.getPrefix(geom.getUserData()))) {
Coordinate center = GisUtil.d2dCoordinate(geom.getCentroid()
.getCoordinate());
state.strings.put(center, "W");
Geometry geom2 = null;
Geometry warningAreaN = null;
Coordinate populatePt = null;
Geometry populatePtGeom;
boolean contained = false, closeTo = false;
double shift = 1.E-8, distance, minDistance = 10.0;
int loop, maxLoop = 10;
Geometry warningArea = state.getWarningArea();
String prefix = GeometryUtil.getPrefix(geom.getUserData());
if (prefixes.contains(prefix)) {
loop = 0;
warningAreaN = findLargestGeometry(GeometryUtil.intersection(geom, warningArea));
do {
if (!warningAreaN.isEmpty()) {
populatePt = GisUtil.d2dCoordinate(warningAreaN.getCentroid()
.getCoordinate());
for (GeospatialData f2 : geoData.features) {
geom2 = f2.getGeometry();
if (!GeometryUtil.getPrefix(geom2.getUserData()).equals(prefix)) {
contained = false;
closeTo = false;
populatePtGeom = PolygonUtil.createPolygonByPoints(populatePt,
new Coordinate(populatePt.x + shift, populatePt.y + shift));
if (GeometryUtil.contains(geom2, populatePtGeom)) {
// populatePt is in another county/zone.
warningAreaN = findLargestQuadrant(warningAreaN, geom);
contained = true;
break;
} else {
distance = populatePtGeom.distance(geom2);
if (distance < minDistance) {
// populatePt is very close to the boundary of another county/zone.
warningAreaN = findLargestQuadrant(warningAreaN, geom);
closeTo = true;
break;
}
}
}
}
} else {
// use the existing populatePt
break;
}
loop += 1;
} while ((contained || closeTo) && loop <= maxLoop);
state.strings.put(populatePt, "W");
}
}
}
@ -3290,4 +3432,65 @@ public class WarngenLayer extends AbstractStormTrackResource {
.createGeometryCollection(new Geometry[0]);
return localToLatLon(result);
}
/**
* If g is a GeometryCollection, find the largest Geomery in it; otherwise (i.e., g is Geometry), return g.
*
* @param g
* A Geometry or a GeometryCollection.
* @return Geometry
*/
private Geometry findLargestGeometry(Geometry g) {
int size = g.getNumGeometries();
if (size == 1)
return g;
double area, maxArea = -1.0;
int index = 0;
for (int i = 0; i < size; i++) {
area = g.getGeometryN(i).getArea();
if (area > maxArea) {
maxArea = area;
index = i;
}
}
return g.getGeometryN(index);
}
/**
* Split the hatched area into four quadrants, and return the largest one.
*
* @param hatchedArea
* The initial hatched area or its a sub area.
* @param geom
* The geometry of a county/zone.
* @return Geometry
* The geometey of largest quadrant among the four, which are the result of
* splitting of hatchedArea.
*/
private Geometry findLargestQuadrant(Geometry hatchedArea, Geometry geom) {
Geometry envelope = hatchedArea.getEnvelope();
Coordinate centroidCoord = GisUtil.d2dCoordinate(envelope.getCentroid()
.getCoordinate());
Coordinate[] envCoords = envelope.getCoordinates();
int size = 4;
Geometry quadrants[] = new Geometry[size];
Geometry intersections[] = new Geometry[size];
double largestArea = -1.0, area = -1.0;
int index = -1;
for (int i = 0; i < size; i++) {
quadrants[i] = PolygonUtil.createPolygonByPoints(envCoords[i], centroidCoord);
intersections[i] = GeometryUtil.intersection(quadrants[i], hatchedArea);
area = intersections[i].getArea();
if (area > largestArea) {
largestArea = area;
index = i;
}
}
if (intersections[index].isValid())
return intersections[index];
else {
// "intersections[" + index + "] is invalid"
return hatchedArea;
}
}
}

View file

@ -157,6 +157,8 @@ import com.vividsolutions.jts.io.WKTReader;
* Jun 18, 2013 2118 njensen Only calculate pathcast if it's actually used
* Aug 19, 2013 2177 jsanchez Passed PortionsUtil to Area class.
* Dec 4, 2013 2604 jsanchez Refactored GisUtil and PortionsUtil.
* Mar 17, 2014 DR 16309 Qinglu Lin Updated getWatches(), processATEntries() and determineAffectedPortions(), and
* added determineAffectedMarinePortions().
* </pre>
*
* @author njensen
@ -1060,7 +1062,7 @@ public class TemplateRunner {
RequestConstraint ugcConstraint = new RequestConstraint("",
ConstraintType.IN);
ugcConstraint.setConstraintValueList(warngenLayer
.getAllCountyUgcs());
.getAllUgcs());
request.addConstraint("ugcZone", ugcConstraint);
// These are the only fields we need for processing watches
@ -1106,7 +1108,7 @@ public class TemplateRunner {
System.out.println("getWatches.polygonBuffer time: "
+ (t1 - t0));
validUgcZones = warngenLayer
.getUgcsForCountyWatches(watchArea);
.getUgcsForWatches(watchArea);
} catch (RuntimeException e) {
statusHandler
.handle(Priority.ERROR,
@ -1223,8 +1225,16 @@ public class TemplateRunner {
if (!work.valid) {
continue;
}
if (determineAffectedPortions(work.ugcZone, asc, geoData, work.waw)) {
rval.addWaw(work.waw);
boolean isMarineZone = warngenLayer.getConfiguration().getGeospatialConfig()
.getAreaSource().equalsIgnoreCase(WarngenLayer.MARINE);
if (!isMarineZone) {
if (determineAffectedPortions(work.ugcZone, asc, geoData, work.waw)) {
rval.addWaw(work.waw);
}
} else {
if (determineAffectedMarinePortions(work.ugcZone, asc, geoData, work.waw)) {
rval.addWaw(work.waw);
}
}
}
@ -1249,7 +1259,7 @@ public class TemplateRunner {
HashMap<String, Set<String>> map = new HashMap<String, Set<String>>();
for (String ugc : ugcs) {
Map<String, String[]> parsed = FipsUtil.parseCountyHeader(ugc);
Map<String, String[]> parsed = FipsUtil.parseHeader(ugc, "County");
Entry<String, String[]> e = null;
// Either zero or more than one sates/counties would be wrong
@ -1308,6 +1318,91 @@ public class TemplateRunner {
return true;
}
/**
* Given the list of marine zones in a watch, fill out the "portions" part of
* the given WeatherAdvisoryWatch. Also checks if the given marine zones are
* actually in the CWA.
*
* @param ugcs
* @param asc
* @param geoData
* @param waw
*/
@SuppressWarnings("deprecation")
private static boolean determineAffectedMarinePortions(List<String> ugcs,
AreaSourceConfiguration asc, GeospatialData[] geoData,
WeatherAdvisoryWatch waw) {
// Maps state abbreviation to unique fe_area values
HashMap<String, Set<String>> map = new HashMap<String, Set<String>>();
Set<String> marinezonenameSet = new HashSet<String>();
for (String ugc : ugcs) {
for (GeospatialData gd: geoData) {
if (gd.attributes.get("ID").equals(ugc)) {
marinezonenameSet.add((String)gd.attributes.get("NAME"));
}
}
}
String marinezonename = "";
int size = marinezonenameSet.size();
Iterator<String> iter = marinezonenameSet.iterator();
int count = 0;
while (iter.hasNext()) {
String s = iter.next();
marinezonename += s;
count += 1;
if (size > 1) {
if (size == 2 && count < 2) {
marinezonename += " and ";
} else {
if (count == size - 1) {
marinezonename += ", and ";
} else {
if (count < size - 1) {
marinezonename += ", ";
}
}
}
}
}
for (String ugc : ugcs) {
Map<String, String[]> parsed = FipsUtil.parseHeader(ugc, "Marine");
Entry<String, String[]> e = null;
// Either zero or more than one marine zone would be wrong
if ((parsed.size() != 1)
|| ((e = parsed.entrySet().iterator().next()).getValue().length != 1)) {
statusHandler.handle(Priority.ERROR,
"Invalid ugczone in active table entry: " + ugc);
continue;
}
String stateAbbrev = e.getKey();
Set<String> feAreas = map.get(stateAbbrev);
if (feAreas == null) {
feAreas = new HashSet<String>();
map.put(stateAbbrev, feAreas);
}
}
ArrayList<Portion> portions = new ArrayList<Portion>(map.size());
Portion portion = new Portion();
portion.parentRegion = marinezonename;
portion.partOfParentRegion = new ArrayList<String>();
portion.partOfParentRegion.add("");
portions.add(portion);
waw.setPortions(portions);
// Set legacy values
if (portions.size() > 0) {
waw.setParentRegion(portions.get(0).parentRegion);
waw.setPartOfParentRegion(portions.get(0).partOfParentRegion);
}
return true;
}
// Based on AWIPS 1 SELSparagraphs.C SELSparagraphs::processWOU().
private static String mungeFeAreas(Set<String> feAreas) {
String abrev = "";

View file

@ -34,6 +34,10 @@ import java.util.regex.Pattern;
* Oct 18, 2012 15332 jsanchez Replaced listOfAreaNamesPtrn with String pattern.
* Mar 13, 2013 DR 15892 D. Friedman Allow some punctuation in area names.
* Apr 18, 2013 DR 16055 D. Friedman Allow more than one contiguous space in areas.
* Jan 6, 2014 DR 16627 Qinglu Lin Updated listOfAreaName to get county name list locked when county abbreviation
* is dropped, a name has more than one word, two names are separated by slash (/),
* or a name has an apostrophe (') for Significant Weather Advisory, Special Weather
* Statement, and Short Term Forecast.
*
* </pre>
*
@ -57,7 +61,7 @@ public interface ICommonPatterns {
// LOCK_END can be added at the start of the line if a previous line has
// been locked.
public static final String listOfAreaName = "^((" + LOCK_END
+ "){0,1}((([\\?\\(\\)\\w\\.,/'-]+\\s{1,})+\\w{2}-)*(([\\?\\(\\)\\w\\.,/'-]+\\s{1,})+\\w{2}-)))";
+ "){0,1}((([\\?\\(\\)\\w\\.,/'-])+(\\s{1,}\\w{2}){0,1}(\\s{1,}\\w{1,}([\\/\\']\\w{0,}\\s{0,}\\w{0,}){0,}){0,}-)*))";
// LOCK_END should not be found at the beginning of a first bullet since the
// previous line should be blank.

View file

@ -50,6 +50,7 @@ import com.raytheon.viz.warnings.DateUtil;
* Apr 25, 2013 1877 jsanchez Sorted the UGC line for cancellations.
* May 10, 2013 1951 rjpeter Updated ugcZones references
* May 31, 2013 DR 16237 D. Friedman Added getUgcFromFips.
* Mar 17, 2014 DR 16309 Qinglu Lin Changed parseCountyHeader() to parseHeader() and updated it..
* </pre>
*
* @author bwoodle
@ -101,7 +102,7 @@ public class FipsUtil {
*/
public static String getUgcLine(AffectedAreas[] areas, Date endtime,
int interval) {
// TODO: If changed, change parseCountyHeader as well to reverse
// TODO: If changed, change parseHeader as well to reverse
StringBuffer rval = new StringBuffer();
ArrayList<String> countiesOrZones = new ArrayList<String>();
DateUtil du = new DateUtil();
@ -177,16 +178,16 @@ public class FipsUtil {
return rval.toString();
}
public static Map<String, String[]> parseCountyHeader(String countyHeader) {
public static Map<String, String[]> parseHeader(String header, String countyOrMarine) {
Map<String, String[]> stateToIdMap = new HashMap<String, String[]>();
// Remove new lines:
String[] lines = countyHeader.split("[\n]");
countyHeader = "";
String[] lines = header.split("[\n]");
header = "";
for (String line : lines) {
countyHeader += line;
header += line;
}
String[] ranges = countyHeader.split("[-]");
String[] ranges = header.split("[-]");
List<String> curList = null;
String curState = null;
for (String range : ranges) {
@ -197,7 +198,11 @@ public class FipsUtil {
stateToIdMap.put(curState,
curList.toArray(new String[curList.size()]));
}
curState = range.substring(0, 2);
if (!countyOrMarine.equals("Marine")) {
curState = range.substring(0, 2);
} else {
curState = "";
}
curList = new ArrayList<String>();
range = range.substring(3);
}

View file

@ -13,6 +13,9 @@ acarssounding.cron=00+10,30,50+*+*+*+?
gfe.cron=0+15+*+*+*+?
repack.cron=0+20+*+*+*+?
# warngen geometries updater
geospatial.updater.cron=0+0+0/1+*+*+?
###purge configuration
# Interval at which the purge job kicks off
purge.cron=0+0/1+*+*+*+?

View file

@ -262,6 +262,13 @@
<bean ref="serializationUtil" method="transformToThrift" />
<to uri="jms-generic:topic:edex.alarms.msg" />
</route>
<!-- Route to send geospatial data update notification -->
<route id="geospatialUpdateNotify">
<from uri="vm:edex.geospatialUpdateNotification" />
<bean ref="serializationUtil" method="transformToThrift" />
<to uri="jms-generic:topic:edex.geospatialUpdate.msg" />
</route>
<!-- Route to periodically close any unused jms resources that have been pooled -->
<route id="jmsPooledResourceChecker">

View file

@ -13,7 +13,7 @@
<property name="record" value="com.raytheon.uf.common.dataplugin.sfcobs.ObsCommon" />
</bean>
<bean factory-bean="pluginRegistry" factory-method="register">
<bean id="sfcObsRegistered" factory-bean="pluginRegistry" factory-method="register">
<constructor-arg ref="sfcobsPluginName" />
<constructor-arg ref="sfcobsProperties"/>
</bean>

View file

@ -110,6 +110,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools;
* 10/28/2013 16711 lbousaidi if the id is not in location table,but defined in geoarea table
* data can be posted to appropriate pe-based tables only if the data
* type is not READING like in A1 code.
* 02/18/2014 16572 l. Bousaidi only apply adjust factor to non missing values.
*
* </pre>
*
@ -642,7 +643,9 @@ public class PostShef {
* SHEF value coming in and if so adjust that value in the shefrec
* structure
*/
adjustRawValue(locId, data);
if (!dataValue.equals(ShefConstants.SHEF_MISSING)) {
adjustRawValue(locId, data);
}
/*
* multiply non-missing values of discharge values and unspecified

View file

@ -20,4 +20,5 @@ Require-Bundle: org.geotools,
Export-Package: com.raytheon.edex.plugin.warning.tools
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.raytheon.uf.common.time,
org.apache.commons.logging,
org.hibernate.annotations

View file

@ -1,6 +1,7 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="generateGeospatialDataRequestHandler" class="com.raytheon.edex.plugin.warning.gis.GenerateGeospatialDataRequestHandler" />
@ -11,4 +12,32 @@
<!-- Instantiating class causes a thread to be run that will generate the warngen geometries -->
<bean class="com.raytheon.edex.plugin.warning.gis.GeospatialDataGeneratorThread" depends-on="spatialQueryRegistered" />
<!--Instantiating class will update the warngen geometries-->
<bean id="geospatialDataUpdater" class="com.raytheon.edex.plugin.warning.gis.GeospatialDataUpdater" />
<camelContext id="geospatialDataUpdater-context"
xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="errorHandler">
<endpoint id="geospatialDataUpdaterCron"
uri="clusteredquartz://warning/geospatialDataUpdaterScheduled/?cron=${geospatial.updater.cron}" />
<route id="geospatialDataUpdaterScheduled">
<from uri="geospatialDataUpdaterCron" />
<to uri="jms-generic:queue:geospatialDataUpdaterScheduledWork" />
</route>
<route id="geospatialDataUpdaterScheduledWork">
<from uri="jms-generic:queue:geospatialDataUpdaterScheduledWork" />
<doTry>
<bean ref="geospatialDataUpdater" method="runCheckUpdate" />
<doCatch>
<exception>java.lang.Throwable</exception>
<to
uri="log:geospatialDataUpdater?level=ERROR" />
</doCatch>
</doTry>
</route>
</camelContext>
</beans>

View file

@ -96,6 +96,7 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier;
* AreaConfiguration to areaFields List.
* May 7, 2013 15690 Qinglu Lin Added convertToMultiPolygon() and updated queryGeospatialData().
* Oct 22, 2013 2361 njensen Use JAXBManager for XML
* Feb 07, 2014 16090 mgamazaychikov Changed visibility of some methods
* </pre>
*
* @author rjpeter
@ -124,12 +125,31 @@ public class GeospatialDataGenerator {
List<String> sites = getBackupSites(dialogConfig);
sites.add(0, mySite);
List<String> templates = getTemplates(dialogConfig);
Set<GeospatialMetadata> metaDataSet = getMetaDataSet(sites, templates);
for (String site : sites) {
statusHandler.handle(Priority.INFO,
"Generating warngen geometries for site: " + site);
for (GeospatialMetadata md : metaDataSet) {
try {
generateGeoSpatialList(site, md);
} catch (Exception e) {
statusHandler
.handle(Priority.ERROR,
"Failed to generate geospatial data for warngen",
e);
}
}
}
}
public static Set<GeospatialMetadata> getMetaDataSet(List<String> sites,
List<String> templates) {
Set<GeospatialMetadata> metaDataSet = new HashSet<GeospatialMetadata>();
for (String site : sites) {
metaDataSet.clear();
statusHandler.handle(Priority.INFO,
"Generating warngen geometries for site: " + site);
// get the unique geospatialMetadata sets to generate
for (String templateName : templates) {
@ -155,21 +175,10 @@ public class GeospatialDataGenerator {
metaDataSet.add(gmd);
}
}
for (GeospatialMetadata md : metaDataSet) {
try {
generateGeoSpatialList(site, md);
} catch (Exception e) {
statusHandler
.handle(Priority.ERROR,
"Failed to generate geospatial data for warngen",
e);
}
}
}
return metaDataSet;
}
private static List<String> getBackupSites(DialogConfiguration dialogConfig) {
static List<String> getBackupSites(DialogConfiguration dialogConfig) {
String[] CWAs = dialogConfig.getBackupCWAs().split(",");
List<String> rval = new ArrayList<String>(CWAs.length + 1);
for (String s : CWAs) {
@ -180,7 +189,7 @@ public class GeospatialDataGenerator {
return rval;
}
private static List<String> getTemplates(DialogConfiguration dialogConfig) {
static List<String> getTemplates(DialogConfiguration dialogConfig) {
String[] mainProducts = dialogConfig.getMainWarngenProducts()
.split(",");
String[] otherProducts = dialogConfig.getOtherWarngenProducts().split(
@ -337,7 +346,7 @@ public class GeospatialDataGenerator {
return rval;
}
private static GeospatialTime queryForCurrentTimes(
static GeospatialTime queryForCurrentTimes(
GeospatialMetadata metaData) throws Exception {
GeospatialTime rval = new GeospatialTime();
String areaSource = metaData.getAreaSource().toLowerCase();

View file

@ -0,0 +1,140 @@
package com.raytheon.edex.plugin.warning.gis;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.raytheon.edex.site.SiteUtil;
import com.raytheon.edex.util.Util;
import com.raytheon.uf.common.dataplugin.warning.config.DialogConfiguration;
import com.raytheon.uf.common.dataplugin.warning.gis.GeospatialFactory;
import com.raytheon.uf.common.dataplugin.warning.gis.GeospatialMetadata;
import com.raytheon.uf.common.dataplugin.warning.gis.GeospatialTime;
import com.raytheon.uf.common.geospatial.SpatialException;
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.edex.core.EDEXUtil;
import com.raytheon.uf.edex.core.EdexException;
/**
* Compares current time in the database against the time of last run
* generated geometry and if they differ regenerates the files.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 07, 2014 16090 mgamazaychikov Initial creation
* </pre>
*
* @author mgamazaychikov
* @version 1.0
*/
public class GeospatialDataUpdater {
private final static IUFStatusHandler statusHandler = UFStatus
.getHandler(GeospatialDataUpdater.class);
private static final String UPDATER_ENDPOINT = "geospatialUpdateNotify";
private static Log logger = LogFactory.getLog(Util.class);
private static Set<GeospatialMetadata> metaDataSet = null;
private static Map<GeospatialMetadata, GeospatialTime> map = null;
public static void runCheckUpdate() throws SpatialException {
StringBuilder sb = new StringBuilder();
if (metaDataSet == null){
runInit();
}
GeospatialTime curTime = null;
GeospatialTime lastRunTime = null;
boolean generate = false;
sb.append("GeospatialDataUpdater: ");
for (GeospatialMetadata md : metaDataSet) {
lastRunTime = map.get(md);
try {
curTime = GeospatialDataGenerator.queryForCurrentTimes(md);
} catch (Exception e) {
throw new SpatialException(
"Unable to look up database version times.",
e);
}
if (!curTime.equals(lastRunTime)) {
generate = true;
break;
}
else {
generate = false;
}
}
if (generate){
sb.append("Geometry database time differs from current geometry metadata time: regenerating geometries");
}
else {
return;
}
if (statusHandler.isPriorityEnabled(Priority.INFO)) {
statusHandler.info(sb.toString());
}
GeospatialDataGenerator.generateUniqueGeospatialMetadataGeometries();
String updatedTimeStamp = getTimeStamp(curTime, lastRunTime);
try {
EDEXUtil.getMessageProducer().sendAsync(UPDATER_ENDPOINT, updatedTimeStamp);
} catch (EdexException e) {
logger.error("Could not send message to alarm/alert", e);
}
metaDataSet = null;
}
private static String getTimeStamp(GeospatialTime curTime,
GeospatialTime lastRunTime) {
long tmStampMs = 0;
if (curTime.getAreaSourceTime() != lastRunTime.getAreaSourceTime()) {
tmStampMs = curTime.getAreaSourceTime();
} else if (curTime.getParentSourceTime() != lastRunTime.getParentSourceTime()) {
tmStampMs = curTime.getParentSourceTime();
} else if (curTime.getTimeZoneSourceTime() != lastRunTime.getTimeZoneSourceTime()) {
tmStampMs = curTime.getTimeZoneSourceTime();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(tmStampMs);
return sdf.format(calendar.getTime());
}
private static void runInit() {
String mySite = SiteUtil.getSite();
DialogConfiguration dialogConfig = null;
try {
dialogConfig = DialogConfiguration.loadDialogConfig(mySite);
} catch (Exception e) {
statusHandler.handle(Priority.ERROR,
"Error loading warngen config.xml", e);
return;
}
List<String> sites = GeospatialDataGenerator.getBackupSites(dialogConfig);
sites.add(0, mySite);
List<String> templates = GeospatialDataGenerator.getTemplates(dialogConfig);
metaDataSet = GeospatialDataGenerator.getMetaDataSet(sites, templates);
map = GeospatialFactory.loadLastRunGeoTimeSet(mySite);
StringBuilder sb = new StringBuilder();
if (statusHandler.isPriorityEnabled(Priority.INFO)) {
sb.append("GeospatialDataUpdater has been re-inited");
statusHandler.info(sb.toString());
}
}
}

View file

@ -17,7 +17,8 @@ Require-Bundle: com.raytheon.uf.common.localization;bundle-version="1.11.24",
com.raytheon.uf.common.serialization.comm;bundle-version="1.12.1174",
com.raytheon.uf.common.gridcoverage;bundle-version="1.0.0",
com.raytheon.uf.common.dataplugin.level;bundle-version="1.12.1174",
org.itadaki.bzip2;bundle-version="0.9.1"
org.itadaki.bzip2;bundle-version="0.9.1",
com.raytheon.uf.edex.ndm
Import-Package: com.raytheon.uf.common.dataplugin.radar,
com.raytheon.uf.common.dataplugin.radar.request,
com.raytheon.uf.common.ohd

View file

@ -6,6 +6,33 @@
<bean id="envData" class="com.raytheon.edex.rpgenvdata.RPGEnvironmentalDataRunner" />
<bean id="radarServerNdmListener" class="com.raytheon.edex.rpgenvdata.ndm.RadarServerNdmSubscriber"/>
<bean factory-bean="ndmProc" factory-method="registerListener">
<constructor-arg value="prodList.txt" />
<constructor-arg ref="radarServerNdmListener" />
</bean>
<bean factory-bean="ndmProc" factory-method="registerListener">
<constructor-arg value="tdwrProdList.txt" />
<constructor-arg ref="radarServerNdmListener" />
</bean>
<bean factory-bean="ndmProc" factory-method="registerListener">
<constructor-arg value="rps-RPGOP-tcp.clear-air" />
<constructor-arg ref="radarServerNdmListener" />
</bean>
<bean factory-bean="ndmProc" factory-method="registerListener">
<constructor-arg value="rps-RPGOP-tcp.storm" />
<constructor-arg ref="radarServerNdmListener" />
</bean>
<bean factory-bean="ndmProc" factory-method="registerListener">
<constructor-arg value="rps-SPGOP-tcp.storm" />
<constructor-arg ref="radarServerNdmListener" />
</bean>
<bean factory-bean="ndmProc" factory-method="registerListener">
<constructor-arg value="wmoSiteInfo.txt" />
<constructor-arg ref="radarServerNdmListener" />
</bean>
<camelContext id="rpgenvdata-camel" xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="errorHandler">
<endpoint id="rpgEnvDataCron" uri="clusteredquartz://rpgEnvData/rpgEnvDataRoute/?cron=${rpggenvdata.envdata.cron}"/>

View file

@ -0,0 +1,60 @@
package com.raytheon.edex.rpgenvdata.ndm;
import java.io.File;
import com.raytheon.edex.rpgenvdata.RcmClient;
import com.raytheon.rcm.mqsrvr.ReqObj.SendConfigFile;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.edex.ndm.ingest.INationalDatasetSubscriber;
/**
* Sends NDM configuration files to the RadarServer.
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 2014-02-03 DR 14762 D. Friedman Created.
* </pre>
*
*/
public class RadarServerNdmSubscriber implements INationalDatasetSubscriber {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(RadarServerNdmSubscriber.class);
// TODO: duplicate..
private class MyRcmClient extends RcmClient {
@Override
public void onFailure(String detail, Exception e) {
statusHandler.handle(Priority.SIGNIFICANT, detail, e);
}
}
@Override
public void notify(String fileName, File file) {
MyRcmClient rcmClient = null;
try {
try {
rcmClient = new MyRcmClient();
rcmClient.initialize();
SendConfigFile req = new SendConfigFile();
req.fileName = file.getName();
req.fileData = FileUtil.file2bytes(file);
rcmClient.sendCheckedAndHandled(req);
} catch (Exception e) {
// TODO: maybe rely on caller exception handling?
rcmClient = null;
statusHandler.handle(Priority.SIGNIFICANT,
"Error initializing RadarServer connection", e);
}
} finally {
if (rcmClient != null) {
rcmClient.close();
}
}
}
}

View file

@ -1,9 +1,11 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="fileChangedStrategy" class="com.raytheon.uf.edex.esb.camel.FileChangedExclusiveReadLockStrategy"/>
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="textDBStaticDataListener" class="com.raytheon.edex.textdb.ingest.TextDBStaticDataSubscriber">
<constructor-arg value="jms-generic:topic:textDBFilesChanged"/>
</bean>
<bean id="textDBStaticDataListener" class="com.raytheon.edex.textdb.ingest.TextDBStaticDataSubscriber" />
<bean id="siteMapListener" class="com.raytheon.edex.textdb.ingest.SiteMapNationalDatasetSubscriber" />
<bean factory-bean="ndmProc" factory-method="registerListener">
@ -38,4 +40,14 @@
<constructor-arg value="national_category_table.template" />
<constructor-arg ref="siteMapListener" />
</bean>
</beans>
<camelContext id="textDbContext"
xmlns="http://camel.apache.org/schema/spring"
errorHandlerRef="errorHandler">
<route id="textDBStaticSetDirty">
<from uri="jms-generic:topic:textDBFilesChanged"/>
<bean ref="textDBStaticDataListener" method="setDirty"/>
</route>
</camelContext>
</beans>

View file

@ -92,6 +92,7 @@ import com.raytheon.uf.common.site.SiteMap;
* Mar 30, 2011 8561 J. Ortiz Added enterEditor flag.
* Jul 29, 2011 10237 R. Ferrel parseCommand now properly validates
* commands with large index.
* Jan 29, 2014 DR14595 mgamazaychikov Added handling of M: command
* </pre>
*
* @author jkorman
@ -104,6 +105,10 @@ public class AFOSParser {
public static final String DRAFT_PIL = "WRKWG";
public static final String MCP_NNN = "MCP";
public static boolean isTemplate = false;
private String productId;
private boolean validCommand = false;
@ -143,6 +148,8 @@ public class AFOSParser {
*/
private boolean parseCommand(String siteId) {
AFOSParser.isTemplate = false;
StringBuilder cmd = new StringBuilder(afosCommand);
ccc = SiteMap.getInstance().getCCCFromXXXCode(siteId);
@ -256,6 +263,13 @@ public class AFOSParser {
nnn = cmd.substring(0, 3);
xxx = cmd.substring(3);
return true;
} else if (afosCommand.startsWith("M:")) {
// Remove the M: from afosCommand
cmd.delete(0, 2);
nnn = MCP_NNN;
xxx = cmd.toString();
AFOSParser.isTemplate = true;
afosCommand = nnn.trim()+xxx.trim();
} else {
// Check for SS.NNN request
int i = cmd.indexOf(".");

View file

@ -55,6 +55,7 @@ import com.raytheon.uf.common.util.StringUtil;
* ------------ ---------- ----------- --------------------------
* Sep 02, 2008 1538 jkorman Initial creation
* Jul 10, 2009 2191 rjpeter Added additional methods.
* Mar 17, 2014 DR 16449 D. Friedman Fix reload/populate.
* Apr 01, 2014 2915 dgilling Major re-factor, all methods are now
* static.
* </pre>

View file

@ -31,6 +31,8 @@ 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.util.FileUtil;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.raytheon.uf.edex.core.EdexException;
import com.raytheon.uf.edex.ndm.ingest.INationalDatasetSubscriber;
/**
@ -45,6 +47,7 @@ import com.raytheon.uf.edex.ndm.ingest.INationalDatasetSubscriber;
* Jan 25, 2011 bfarmer Initial creation
* Oct 18, 2011 10909 rferrel notify() now saves a file.
* Mar 06, 2014 2876 mpduff New NDM plugin.
* Mar 17, 2014 DR 16449 D. Friedman Send 'setDirty' notification to all nodes.
* Mar 20, 2014 2915 dgilling Code cleanup.
*
* </pre>
@ -57,6 +60,12 @@ public class TextDBStaticDataSubscriber implements INationalDatasetSubscriber {
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(TextDBStaticDataSubscriber.class);
private String setDirtyURI;
public TextDBStaticDataSubscriber(String setDirtyURI) {
this.setDirtyURI = setDirtyURI;
}
@Override
public void notify(String fileName, File file) {
// Assumes the fileName is the name of the file to place
@ -68,11 +77,22 @@ public class TextDBStaticDataSubscriber implements INationalDatasetSubscriber {
try {
FileUtil.copyFile(file, outFile);
TextDBStaticData.setDirty();
try {
if (setDirtyURI != null) {
EDEXUtil.getMessageProducer().sendAsyncUri(setDirtyURI, "");
} else {
setDirty();
}
} catch (EdexException e) {
statusHandler.error("Unable to notify that TextDB static files have changes", e);
}
} catch (IOException e) {
statusHandler.error("Unable to copy textdb static data file ["
+ file.getPath() + "] to destination [" + outFile.getPath()
+ "].", e);
}
}
public void setDirty() {
TextDBStaticData.setDirty();
}
}

View file

@ -67,6 +67,18 @@
<longitude>-97.22</longitude>
<elevation>155</elevation>
</airport>
<airport>
<id>ADK</id>
<latitude>51.88</latitude>
<longitude>-176.65</longitude>
<elevation>6</elevation>
</airport>
<airport>
<id>ADQ</id>
<latitude>57.75</latitude>
<longitude>-152.50</longitude>
<elevation>22</elevation>
</airport>
<airport>
<id>AEX</id>
<latitude>31.33</latitude>
@ -97,6 +109,12 @@
<longitude>24.77</longitude>
<elevation>1192</elevation>
</airport>
<airport>
<id>AKN</id>
<latitude>58.68</latitude>
<longitude>-156.65</longitude>
<elevation>17</elevation>
</airport>
<airport>
<id>AKO</id>
<latitude>40.17</latitude>
@ -145,6 +163,12 @@
<longitude>-150.02</longitude>
<elevation>45</elevation>
</airport>
<airport>
<id>ANI</id>
<latitude>61.58</latitude>
<longitude>-159.55</longitude>
<elevation>27</elevation>
</airport>
<airport>
<id>APA</id>
<latitude>39.57</latitude>
@ -205,6 +229,12 @@
<longitude>-73.13</longitude>
<elevation>5</elevation>
</airport>
<airport>
<id>BET</id>
<latitude>60.78</latitude>
<longitude>-161.83</longitude>
<elevation>40</elevation>
</airport>
<airport>
<id>BFI</id>
<latitude>47.53</latitude>
@ -337,6 +367,12 @@
<longitude>4.53</longitude>
<elevation>58</elevation>
</airport>
<airport>
<id>BRW</id>
<latitude>71.28</latitude>
<longitude>-156.77</longitude>
<elevation>16</elevation>
</airport>
<airport>
<id>BSM</id>
<latitude>30.20</latitude>
@ -415,6 +451,12 @@
<longitude>2.55</longitude>
<elevation>117</elevation>
</airport>
<airport>
<id>CDV</id>
<latitude>60.50</latitude>
<longitude>-145.48</longitude>
<elevation>13</elevation>
</airport>
<airport>
<id>CEF</id>
<latitude>42.20</latitude>
@ -547,6 +589,12 @@
<longitude>-97.23</longitude>
<elevation>239</elevation>
</airport>
<airport>
<id>CYXY</id>
<latitude>60.71</latitude>
<longitude>-135.07</longitude>
<elevation>706</elevation>
</airport>
<airport>
<id>CYYZ</id>
<latitude>43.68</latitude>
@ -619,6 +667,12 @@
<longitude>103.68</longitude>
<elevation>12</elevation>
</airport>
<airport>
<id>DLG</id>
<latitude>59.05</latitude>
<longitude>-158.50</longitude>
<elevation>26</elevation>
</airport>
<airport>
<id>DNMM</id>
<latitude>6.50</latitude>
@ -661,6 +715,12 @@
<longitude>6.78</longitude>
<elevation>44</elevation>
</airport>
<airport>
<id>DUT</id>
<latitude>53.90</latitude>
<longitude>-166.55</longitude>
<elevation>4</elevation>
</airport>
<airport>
<id>DXR</id>
<latitude>41.37</latitude>
@ -895,6 +955,12 @@
<longitude>-1.32</longitude>
<elevation>94</elevation>
</airport>
<airport>
<id>ENA</id>
<latitude>60.57</latitude>
<longitude>-151.25</longitude>
<elevation>28</elevation>
</airport>
<airport>
<id>ENAL</id>
<latitude>62.50</latitude>
@ -1309,6 +1375,12 @@
<longitude>-82.22</longitude>
<elevation>296</elevation>
</airport>
<airport>
<id>GST</id>
<latitude>58.43</latitude>
<longitude>-135.71</longitude>
<elevation>11</elevation>
</airport>
<airport>
<id>GTF</id>
<latitude>47.48</latitude>
@ -1387,6 +1459,12 @@
<longitude>-76.23</longitude>
<elevation>9999</elevation>
</airport>
<airport>
<id>HOM</id>
<latitude>59.65</latitude>
<longitude>-151.48</longitude>
<elevation>24</elevation>
</airport>
<airport>
<id>HOU</id>
<latitude>29.65</latitude>
@ -1495,6 +1573,12 @@
<longitude>-73.78</longitude>
<elevation>7</elevation>
</airport>
<airport>
<id>JNU</id>
<latitude>58.36</latitude>
<longitude>-134.58</longitude>
<elevation>7</elevation>
</airport>
<airport>
<id>JSJ</id>
<latitude>18.43</latitude>
@ -1537,6 +1621,12 @@
<longitude>-118.08</longitude>
<elevation>774</elevation>
</airport>
<airport>
<id>KTN</id>
<latitude>55.35</latitude>
<longitude>-131.71</longitude>
<elevation>29</elevation>
</airport>
<airport>
<id>KUL</id>
<latitude>3.12</latitude>
@ -2473,6 +2563,12 @@
<longitude>-95.90</longitude>
<elevation>299</elevation>
</airport>
<airport>
<id>OME</id>
<latitude>64.51</latitude>
<longitude>-165.45</longitude>
<elevation>11</elevation>
</airport>
<airport>
<id>ONT</id>
<latitude>34.05</latitude>
@ -2509,6 +2605,12 @@
<longitude>36.50</longitude>
<elevation>615</elevation>
</airport>
<airport>
<id>OTZ</id>
<latitude>66.88</latitude>
<longitude>-162.60</longitude>
<elevation>4</elevation>
</airport>
<airport>
<id>PAE</id>
<latitude>47.92</latitude>
@ -2611,6 +2713,12 @@
<longitude>-73.88</longitude>
<elevation>50</elevation>
</airport>
<airport>
<id>PSG</id>
<latitude>56.80</latitude>
<longitude>-132.95</longitude>
<elevation>35</elevation>
</airport>
<airport>
<id>PSP</id>
<latitude>33.83</latitude>
@ -2827,6 +2935,12 @@
<longitude>-86.32</longitude>
<elevation>236</elevation>
</airport>
<airport>
<id>SCC</id>
<latitude>70.19</latitude>
<longitude>-148.47</longitude>
<elevation>20</elevation>
</airport>
<airport>
<id>SCEL</id>
<latitude>-33.38</latitude>
@ -2851,6 +2965,12 @@
<longitude>-85.73</longitude>
<elevation>151</elevation>
</airport>
<airport>
<id>SDP</id>
<latitude>55.32</latitude>
<longitude>-160.52</longitude>
<elevation>7</elevation>
</airport>
<airport>
<id>SDQ</id>
<latitude>18.43</latitude>
@ -2911,6 +3031,12 @@
<longitude>103.85</longitude>
<elevation>16</elevation>
</airport>
<airport>
<id>SIT</id>
<latitude>57.05</latitude>
<longitude>-135.36</longitude>
<elevation>8</elevation>
</airport>
<airport>
<id>SJC</id>
<latitude>37.37</latitude>
@ -2989,6 +3115,12 @@
<longitude>-117.88</longitude>
<elevation>16</elevation>
</airport>
<airport>
<id>SNP</id>
<latitude>57.17</latitude>
<longitude>-170.22</longitude>
<elevation>13</elevation>
</airport>
<airport>
<id>SPI</id>
<latitude>39.85</latitude>
@ -3247,6 +3379,12 @@
<longitude>-117.38</longitude>
<elevation>876</elevation>
</airport>
<airport>
<id>VDZ</id>
<latitude>61.13</latitude>
<longitude>-146.25</longitude>
<elevation>37</elevation>
</airport>
<airport>
<id>VECC</id>
<latitude>22.70</latitude>
@ -3343,6 +3481,12 @@
<longitude>-122.72</longitude>
<elevation>937</elevation>
</airport>
<airport>
<id>WRG</id>
<latitude>56.48</latitude>
<longitude>-132.37</longitude>
<elevation>15</elevation>
</airport>
<airport>
<id>WSSS</id>
<latitude>1.37</latitude>
@ -3355,6 +3499,12 @@
<longitude>-64.68</longitude>
<elevation>6</elevation>
</airport>
<airport>
<id>YAK</id>
<latitude>59.50</latitude>
<longitude>-139.66</longitude>
<elevation>10</elevation>
</airport>
<airport>
<id>YARG</id>
<latitude>-16.63</latitude>

View file

@ -4159,7 +4159,7 @@ in | .03937 | 0 | 4 | | |..|8000F0FF| | 16 | \
</contourLabeling>
</contourStyle>
</styleRule>
<styleRule>
<styleRule>
<paramLevelMatches>
<parameter>TEMPWTR</parameter>
</paramLevelMatches>
@ -4167,4 +4167,20 @@ in | .03937 | 0 | 4 | | |..|8000F0FF| | 16 | \
<displayUnits>C</displayUnits>
</contourStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>zAGL</parameter>
<parameter>GH</parameter>
<singleLevel units="FRZ" />
<singleLevel units="TW0" />
</paramLevelMatches>
<contourStyle>
<displayUnits>ft</displayUnits>
<contourLabeling labelSpacing="4">
<increment>1000</increment>
</contourLabeling>
</contourStyle>
</styleRule>
</styleRuleset>

View file

@ -4900,4 +4900,25 @@
<displayUnits>C</displayUnits>
</imageStyle>
</styleRule>
<styleRule>
<paramLevelMatches>
<parameter>zAGL</parameter>
<parameter>GH</parameter>
<singleLevel units="FRZ" />
<singleLevel units="TW0" />
</paramLevelMatches>
<imageStyle>
<displayUnits>ft</displayUnits>
<range scale="LINEAR">
<minValue>0</minValue>
<maxValue>20000</maxValue>
</range>
<defaultColormap>Grid/gridded data</defaultColormap>
<colorbarLabeling>
<increment>5000</increment>
</colorbarLabeling>
</imageStyle>
</styleRule>
</styleRuleset>

View file

@ -75,6 +75,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
* Oct 14, 2013 2361 njensen Removed IDecoderGettable
* Dec 10, 2013 2616 mpduff Added stationId to the unique constraint
* jan 22, 2014 2713 dhladky Calendar conversion.
* Mar 21, 2014 2939 dhladky Fixed mismatches in HDF5, DB records.
*
* </pre>
*
@ -85,7 +86,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
@Entity
@SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "madisseq")
@Table(name = "madis", uniqueConstraints = { @UniqueConstraint(columnNames = {
"location", "stationId", "refTime", "provider", "subProvider", "restriction" }) })
"latitude", "longitude", "stationId", "refTime", "provider", "subProvider", "restriction" }) })
@org.hibernate.annotations.Table(appliesTo = "madis", indexes = { @Index(name = "madis_wfsQueryIndex", columnNames = {
"refTime", "location" }), })
@DynamicSerialize
@ -121,7 +122,7 @@ public class MadisRecord extends PersistablePluginDataObject implements
@Column
@DataURI(position = 4)
private int restriction;
/** A string denoting the time of observation */
@DynamicSerializeElement
@Transient
@ -349,7 +350,7 @@ public class MadisRecord extends PersistablePluginDataObject implements
@DynamicSerializeElement
@Embedded
private PointDataView pointDataView;
public static final String PLUGIN_NAME = "madis";
public static final String STATION_ID = "stationId";
@ -453,6 +454,19 @@ public class MadisRecord extends PersistablePluginDataObject implements
public static final String RESTRICTION = "RESTRICTION";
}
/**
* URI constructor
* @param string
*/
public MadisRecord(String string) {
super();
}
//empty constructor
public MadisRecord() {
}
/**
* Get the pointdata view
@ -1086,4 +1100,14 @@ public class MadisRecord extends PersistablePluginDataObject implements
public String getPluginName() {
return PLUGIN_NAME;
}
/**
* Allow overwrite of MADIS records
* MADIS records are frequently updated for even the same temporal
* record. QC value changes will cause record re-submissions.
* @return
*/
public boolean getAllowOverWrite() {
return true;
}
}

View file

@ -134,6 +134,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject.
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
* Dec 18, 2013 16002 kshrestha Added logic to match all dBZ values in the DHR with AWIPS1
*
* </pre>
*
@ -890,6 +891,8 @@ public class RadarRecord extends PersistablePluginDataObject implements
double[] pix = { 256 - nLevels, 255 };
if (getProductCode() == 155) {
pix = new double[] { 129, 149 };
} else if(getProductCode() == 32) {
pix = new double[]{ 2, 256 };
}
double[] data = { offset, offset + ((nLevels - 1) * scale) };

View file

@ -27,6 +27,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
* Nov 15, 2010 mschenke Initial creation
* Apr 28, 2013 1955 jsanchez Added an ignoreUserData flag to intersection method.
* Oct 21, 2013 DR 16632 D. Friedman Handle zero-length input in union.
* Dec 13, 2013 DR 16567 Qinglu Lin Added contains().
*
* </pre>
*
@ -299,4 +300,25 @@ public class GeometryUtil {
}
return str;
}
/**
* Determine if one geometry contains any portion of the other.
* @param g1
* @param g2
*/
public static boolean contains(Geometry g1, Geometry g2) {
int m = g1.getNumGeometries();
int n = g2.getNumGeometries();
Geometry geom1 = null;
Geometry geom2 = null;
for (int i = 0; i < m; i++) {
geom1 = g1.getGeometryN(i);
for (int j = 0; j < n; j++) {
geom2 = g2.getGeometryN(j);
if (geom1.contains(geom2))
return true;
}
}
return false;
}
}

View file

@ -10,6 +10,7 @@
##### like the ~ and % characters in A1.
##### Evan Bookbinder 05-05-2013 handleClosesPoints and 3rd bullet changes (OVER & now)
##### Evan Bookbinder 09-20-2013 Fixed rural area otherPoints in pathcast section, added rural phrase
##### Qinglu Lin 03-17-2014 DR 16309. Updated inserttorwatches and insertsvrwatches.
####################################################################################################
#*
Mile Marker Test Code
@ -201,12 +202,12 @@ ${dateUtil.period(${watches.getLatestTorTime()},${timeFormat.plain}, 15, ${local
#if(${secondtimezone})
/${dateUtil.format(${watch.getEndTime()}, ${timeFormat.plain}, 15, ${secondtimezone})}/##
#end
FOR ##
FOR##
#set($numPortions = ${list.size(${watch.getPortions()})})
#set($count = 0)
#foreach(${portion} in ${watch.getPortions()})
#set($count = $count + 1)
#areaFormat(${portion.partOfParentRegion} true false false) ${portion.parentRegion}##
#areaFormat(${portion.partOfParentRegion} true false true)${portion.parentRegion}##
#if($count == $numPortions - 1)
AND ##
#elseif($count < $numPortions)
@ -214,7 +215,7 @@ ${dateUtil.period(${watches.getLatestTorTime()},${timeFormat.plain}, 15, ${local
#end
#end
#set($torWatchAlso = "ALSO ")
.##
. ##
#end
#end
@ -235,12 +236,12 @@ ${dateUtil.period(${watches.getLatestSvrTime()},${timeFormat.plain}, 15, ${local
#if(${secondtimezone})
/${dateUtil.format(${watch.getEndTime()}, ${timeFormat.plain}, 15, ${secondtimezone})}/##
#end
FOR ##
FOR##
#set($numPortions = ${list.size(${watch.getPortions()})})
#set($count = 0)
#foreach(${portion} in ${watch.getPortions()})
#set($count = $count + 1)
#areaFormat(${portion.partOfParentRegion} true false) ${portion.parentRegion}##
#areaFormat(${portion.partOfParentRegion} true false true)${portion.parentRegion}##
#if($count == $numPortions - 1)
AND ##
#elseif($count < $numPortions)
@ -248,7 +249,7 @@ ${dateUtil.period(${watches.getLatestSvrTime()},${timeFormat.plain}, 15, ${local
#end
#end
#set($svrWatchAlso = "ALSO ")
.##
. ##
#end
#end

View file

@ -372,6 +372,7 @@ ${canwarning}
#insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat})
#end
#end
##
#######################################################################
## MWS CON PRODUCT
@ -544,6 +545,7 @@ REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY
#insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat})
#end
#end
##
## #####################################################################
## MWS CAN/CON PRODUCT
@ -921,6 +923,7 @@ THE ${eventType} !** WEAKENED / MOVED OUT OF THE WARNED AREA **! AND NO LONGER $
#if(${list.contains(${includedWatches}, "svrWatches")})
#insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat})
#end
#if(${productClass}=="T")
THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE.
@ -929,7 +932,6 @@ THIS IS A TEST MESSAGE. DO NOT TAKE ACTION BASED ON THIS MESSAGE.
#tml(${TMLtime}, ${timeFormat}, ${movementDirection}, ${movementInKnots}, ${eventLocation})
$$
${ugcline}
@ -1109,6 +1111,7 @@ REPORT SEVERE WEATHER TO THE COAST GUARD OR NEAREST LAW ENFORCEMENT AGENCY. THEY
#insertsvrwatches(${watches}, ${list}, ${secondtimezone}, ${dateUtil}, ${timeFormat})
#end
#end
##
## #####################################################################
## MWS EXP PRODUCT

View file

@ -28,6 +28,21 @@ import java.io.IOException;
import com.raytheon.uf.common.ohd.AppsDefaults;
import com.raytheon.uf.common.util.FileUtil;
/**
* TODO Returns HRAP Coordinates
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 18, 2014 17067 snaples Added trim to readline to prevent parsing issues.
*
* </pre>
*
* @author snaples
* @version 1.0
*/
public class HRAPCoordinates {
public static Rectangle getHRAPCoordinates() throws Exception {
@ -49,13 +64,13 @@ public class HRAPCoordinates {
String line = null;
try {
in = new BufferedReader(new FileReader(coordFile));
line = in.readLine();
line = in.readLine().trim();
Hrap_XOR = Integer.parseInt(line);
line = in.readLine();
line = in.readLine().trim();
Hrap_YOR = Integer.parseInt(line);
line = in.readLine();
line = in.readLine().trim();
Hrap_MAXX = Integer.parseInt(line);
line = in.readLine();
line = in.readLine().trim();
Hrap_MAXY = Integer.parseInt(line);
} catch (FileNotFoundException e) {
throw new Exception("unable to find coordinate file: "

View file

@ -77,8 +77,8 @@ import com.vividsolutions.jts.io.WKTWriter;
* ------------ ---------- ----------- --------------------------
* 02/11/2009 1981 dhladky Initial Creation.
* 09/03/2013 DR 13083 gzhang Added getZRvalue2() to fix an error.
* 12/20/2013 DR 16894 gzhang Fixed getZRvalue2() bias issue.
* </pre>
*
* @author dhladky
* @version 1.0
*/
@ -1945,16 +1945,16 @@ public class ScanUtils {
if (zValue >= 2) {
zValue = MIN_DHR_DBZ + ((zValue - 2) * DHR_DBZ_STEP);
double rlogMult = Math.log10(coefficent);
rValue = bias*(Math.pow(10.0, ((zValue-10.0*rlogMult)/(10.0*power))));
rValue = /*bias* */(Math.pow(10.0, ((zValue-10.0*rlogMult)/(10.0*power))));
// hail cap check
if (rValue > hailCap) {
return (float) (MM_TO_INCH * hailCap);
rValue = /*return (float) */(/*MM_TO_INCH * */hailCap);
}
} else {
return (float) rValue;
rValue = /*return */(float) rValue;
}
return (float) (MM_TO_INCH * rValue);
return (float) (bias*MM_TO_INCH * rValue);
}
}

View file

@ -125,6 +125,7 @@
#
#10/01/09 - Added 5 tokens for arcnav application. //only for arcnav for raxum application
#10/03/12 - Added token section for script execution
#02/12/2014 - Added token for default display to replace field in rwprefs table
#02/18/14 - Added section for run_report_alarm service configuration.
@ -972,6 +973,7 @@ mpe_map_width : 1320
mpe_zoom_out_limit : 20
mpe_disclosure_limit : 60
mpe_map_projection : FLAT
mpe_def_display : MMOSAIC
### Misc tokens
mpe_load_hourlypc : ON

View file

@ -21,6 +21,7 @@ package com.raytheon.uf.edex.database.handlers;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -47,7 +48,8 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 5, 2011 njensen Initial creation
* Apr 05, 2011 njensen Initial creation
* Mar 24, 2014 2941 mpduff Sort data before returning it.
*
* </pre>
*
@ -180,6 +182,8 @@ public class TimeQueryHandler implements IRequestHandler<TimeQueryRequest> {
}
}
}
Collections.sort(times);
return times;
}

View file

@ -1,8 +1,6 @@
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="fileChangedStrategy" class="com.raytheon.uf.edex.esb.camel.FileChangedExclusiveReadLockStrategy"/>
<bean id="disseminationListener" class="com.raytheon.uf.edex.dissemination.ingest.DisseminationNationalDatasetSubscriber" />
<bean factory-bean="ndmProc" factory-method="registerListener">

View file

@ -57,6 +57,7 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory;
* ------------ ---------- ----------- --------------------------
* Sep 8, 2009 snaples Initial creation
* Feb 15, 2013 1638 mschenke Moved DataURINotificationMessage to uf.common.dataplugin
* Mar 19, 2014 17109 snaples Removed code that adds 1 hour to grid reftime, was not needed.
*
* </pre>
*
@ -229,8 +230,6 @@ public class SatPrecipFileBuilder {
// this get the reftime of the record
grReftime = gr.getDataTime().getRefTime();
long millis = grReftime.getTime();
// convert 1 hour to milliseconds to add to time.
millis += 60 * 60 * 1000;
grReftime.setTime(millis);
}

View file

@ -21,6 +21,17 @@ import com.raytheon.uf.common.dataplugin.acarssounding.ACARSSoundingRecord;
import com.raytheon.uf.common.pointdata.spatial.AircraftObsLocation;
import com.raytheon.uf.edex.decodertools.time.TimeTools;
/**
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* ?? ?? Initial creation
* Feb 24, 2014 DR15038 M.Porricelli Modified 'accept' to
* not discard sounding data
* based on altitude here
*/
public final class ACARSSoundingTools {
// 30 minute offset to apply to observation time.
@ -436,13 +447,8 @@ public final class ACARSSoundingTools {
if (altitudes != null) {
double minAlt = altitudes.get(0).doubleValue();
double maxAlt = altitudes.get(1).doubleValue();
// We want the lowest entry to be at or below MAX_FIRST
if (minAlt <= MAX_FIRST) {
// Is the sounding deep enough? If not, clear the list.
if ((maxAlt - minAlt) < MIN_DEPTH) {
soundingList.clear();
}
} else {
// Is the sounding deep enough? If not, clear the list.
if ((maxAlt - minAlt) < MIN_DEPTH) {
soundingList.clear();
}
}

View file

@ -56,6 +56,11 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools;
* ------------ ---------- ----------- --------------------------
* Apr 16, 2009 jkorman Initial creation
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
* Feb 24, 2014 DR15038 M.Porricelli In createSounding, use
* difference between flight
* level and airport elevation
* to determine which airport
* to use
*
* </pre>
*
@ -203,17 +208,17 @@ public class SoundingBuilder {
List<ACARSRecord> obsData) {
ACARSSoundingRecord sounding = null;
if (obsData != null) {
// examine the lower MAX_FIRST meters of the data to determine which
// airport to use.
Airport airport = null;
Double dist = Double.MAX_VALUE;
ACARSRecord recObs = null;
for (ACARSRecord r : obsData) {
if (r.getFlightLevel() < ACARSSoundingTools.MAX_FIRST) {
Airport a = airports.nearest(r,
ACARSSoundingTools.MAX_DISTANCE);
if ((a != null) && (a.getDistance() < dist)) {
Airport a = airports
.nearest(r, ACARSSoundingTools.MAX_DISTANCE);
if (a != null
&& (r.getFlightLevel() - a.getElevation()) < ACARSSoundingTools.MAX_FIRST) {
if ((a.getDistance() < dist)) {
// Keep track of the obs that contributes the distance.
recObs = r;
dist = a.getDistance();
@ -221,7 +226,7 @@ public class SoundingBuilder {
}
}
}
// If we have an airport we'll use that to create the sounding
// If we have an airport we'll use that to create the sounding
if (airport != null) {
sounding = new ACARSSoundingRecord();
Calendar soundingTime = recObs.getTimeObs();

View file

@ -6,7 +6,7 @@
<bean id="bufrFileSeparator" class="com.raytheon.uf.common.nc.bufr.BufrFileSeparator" />
<bean id="bufrobsSynopticLandDecoder" class="com.raytheon.uf.edex.plugin.bufrobs.synoptic.SynopticLandBufrDecoder">
<bean id="bufrobsSynopticLandDecoder" class="com.raytheon.uf.edex.plugin.bufrobs.synoptic.SynopticLandBufrDecoder" depends-on="sfcObsRegistered">
<constructor-arg ref="sfcobsPluginName" />
</bean>

View file

@ -22,8 +22,7 @@
<constructor-arg ref="madis-camel" />
</bean>
<bean id="madisSeparator" class="com.raytheon.uf.edex.plugin.madis.MadisSeparator"
depends-on="jmsIngestMadisConfig, jms-madis, madisThreadPool">
<bean id="madisSeparator" class="com.raytheon.uf.edex.plugin.madis.MadisSeparator">
<constructor-arg
value="jms-durable:queue:Ingest.madisSeparator" />
<!-- time in hours for orphan purging -->

View file

@ -47,6 +47,7 @@ import com.raytheon.uf.edex.pointdata.PointDataQuery;
* 28 Mar 2013 1746 dhladky Created
* 10 Jun 2013 1763 dhladky Updates for speed.
* 08 Jul 2013 2171 dhladky Removed dataURI
* 21 Mar 2014 2939 dhladky Fixed mismatches in HDF5, DB records.
* </pre>
*
* @author dhladky
@ -164,8 +165,10 @@ public class MadisPointDataTransform {
public static final String RESTRICTION = "restriction";
public static final String TIME_OBS = "timeObs";
public static final String ID = "id";
public static final String EQUAL = "=";
public static final String[] ALL_PARAMS = { DATASET, DEWPOINT,
DEWPOINT_QCD, DEWPOINT_QCA, DEWPOINT_QCR, RH, RH_QCD, RH_QCA,
@ -249,10 +252,7 @@ public class MadisPointDataTransform {
private PointDataView buildView(PointDataContainer container,
MadisRecord record) {
PointDataView pdv = container.append();
// I think this is inefficient but, PlotData for SVG reads
// the pointDataView so, the first 4 that are already in the
// DB have to be here.
pdv.setLong(TIME_OBS, record.getDataTime().getRefTime().getTime());
pdv.setString(PROVIDER, record.getProvider());
pdv.setString(SUB_PROVIDER, record.getSubProvider());
@ -310,75 +310,10 @@ public class MadisPointDataTransform {
pdv.setString(PRESSURE_QCD, record.getPressure_qcd().toString());
pdv.setInt(PRESSURE_QCA, record.getPressure_qca());
pdv.setInt(PRESSURE_QCR, record.getPressure_qcr());
return pdv;
}
/**
* Creates a MadisRecord from a PointDataContainer
*
* @param pdc
* @return
*/
public static MadisRecord toMadisRecord(MadisRecord mr) {
PointDataView pdv = mr.getPointDataView();
mr.setDataset(pdv.getInt(DATASET));
// dewpoint
mr.setDewpoint(pdv.getFloat(DEWPOINT));
mr.setDewpoint_qcd(QCD.fromString(pdv.getString(DEWPOINT_QCD)));
mr.setDewpoint_qca(pdv.getInt(DEWPOINT_QCA));
mr.setDewpoint_qcr(pdv.getInt(DEWPOINT_QCR));
// relative humidty
mr.setRh(pdv.getFloat(RH));
mr.setRh_qcd(QCD.fromString(pdv.getString(RH_QCD)));
mr.setRh_qca(pdv.getInt(RH_QCA));
mr.setRh_qcr(pdv.getInt(RH_QCR));
// altimeter setting
mr.setAltimeter(pdv.getFloat(ALTIMETER));
mr.setAltimeter_qcd(QCD.fromString(pdv.getString(ALTIMETER_QCD)));
mr.setAltimeter_qca(pdv.getInt(ALTIMETER_QCA));
mr.setAltimeter_qcr(pdv.getInt(ALTIMETER_QCR));
// temperature
mr.setTemperature(pdv.getFloat(TEMPERATURE));
mr.setTemperature_qcd(QCD.fromString(pdv.getString(TEMPERATURE_QCD)));
mr.setTemperature_qca(pdv.getInt(TEMPERATURE_QCA));
mr.setTemperature_qcr(pdv.getInt(TEMPERATURE_QCR));
// wind direction
mr.setWindDirection(pdv.getNumber(WINDDIRECTION).intValue());
mr.setWindDirection_qcd(QCD.fromString(pdv.getString(WINDDIRECTION_QCD)));
mr.setWindDirection_qca(pdv.getInt(WINDDIRECTION_QCA));
mr.setWindDirection_qcr(pdv.getInt(WINDDIRECTION_QCR));
// precip rate
mr.setPrecipRate(pdv.getFloat(PRECIPRATE));
mr.setPrecipRate_qcd(QCD.fromString(pdv.getString(PRECIPRATE_QCD)));
mr.setPrecipRate_qca(pdv.getInt(PRECIPRATE_QCA));
mr.setPrecipRate_qcr(pdv.getInt(PRECIPRATE_QCR));
// WINDSPEED
mr.setWindSpeed(pdv.getFloat(WINDSPEED));
mr.setWindSpeed_qcd(QCD.fromString(pdv.getString(WINDSPEED_QCD)));
mr.setWindSpeed_qca(pdv.getInt(WINDSPEED_QCA));
mr.setWindSpeed_qcr(pdv.getInt(WINDSPEED_QCR));
// Wind Gust
mr.setWindGust(pdv.getFloat(WINDGUST));
mr.setWindGust_qcd(QCD.fromString(pdv.getString(WINDGUST_QCD)));
mr.setWindGust_qca(pdv.getInt(WINDGUST_QCA));
mr.setWindGust_qcr(pdv.getInt(WINDGUST_QCR));
// Precipital Water
mr.setPrecipitalWater(pdv.getFloat(PRECIPITALWATER));
mr.setPrecipitalWater_qcd(QCD.fromString(pdv
.getString(PRECIPITALWATER_QCD)));
mr.setPrecipitalWater_qca(pdv.getInt(PRECIPITALWATER_QCA));
mr.setPrecipitalWater_qcr(pdv.getInt(PRECIPITALWATER_QCR));
// Pressure
mr.setPressure(pdv.getFloat(PRESSURE));
mr.setPressure_qcd(QCD.fromString(pdv.getString(PRESSURE_QCD)));
mr.setPressure_qca(pdv.getInt(PRESSURE_QCA));
mr.setPressure_qcr(pdv.getInt(PRESSURE_QCR));
return mr;
}
/**
* Creates a MadisRecord from a PointDataContainer
*
@ -458,7 +393,7 @@ public class MadisPointDataTransform {
try {
request = new PointDataQuery(MadisRecord.PLUGIN_NAME);
request.requestAllLevels();
request.addParameter(ID, ""+record.getId(), "=");
request.addParameter(ID, String.valueOf(record.getId()), EQUAL);
request.setParameters(ALL_PARAMS_LIST);
result = request.execute();
@ -483,9 +418,7 @@ public class MadisPointDataTransform {
* @return populated Madis record Array
* @throws PluginException
*/
// TODO I would like to make a PointDataInterface that could implement this
// and other methods that all of these
// will use.
public static PluginDataObject[] populatePointDataFields(
PluginDataObject[] records) {
@ -507,10 +440,19 @@ public class MadisPointDataTransform {
request.addParameter(ID, ids.toString(), IN);
request.setParameters(ALL_PARAMS_LIST);
result = request.execute();
// correlate up the PointDataViews with the correct records.
HashMap<Integer, PointDataView> pdvs = new HashMap<Integer, PointDataView>(records.length);
for (int i = 0; i < records.length; i++) {
PointDataView pdv = result.readRandom(i);
toMadisRecord((MadisRecord) records[i], pdv);
// correlate ID from record with ID from PDV
int id = pdv.getInt(ID);
pdvs.put(id, pdv);
}
for (int i = 0; i < records.length; i++) {
int id = records[i].getId();
records[i] = toMadisRecord((MadisRecord)records[i], pdvs.get(id));
}
if (result != null) {

View file

@ -69,6 +69,7 @@ import com.raytheon.uf.edex.plugin.satellite.mcidas.util.McidasSatelliteLookups.
* 07/12/2012 798 jkorman Changed projection "magic" numbers
* 09/24/2012 1210 jkorman Modified the decode method to create the
* IDataRecord required by the SatelliteDao
* 12/03/2013 DR 16841 D. Friedman Allow record overwrites
* </pre>
*
* @author
@ -246,6 +247,7 @@ public class McidasSatelliteDecoder {
rec.setTraceId(traceId);
rec.setPersistenceTime(TimeTools.getSystemCalendar().getTime());
rec.constructDataURI();
rec.setOverwriteAllowed(true);
// Set the data into the IDataRecord
// Set the data into the IDataRecord

View file

@ -26,6 +26,51 @@ if [ -d $SVCBU_HOME ];then
echo ${SVCBU_HOME}/* | xargs rm -rf
fi
# DR 16362
if [ -d ${LOCALIZATION_PATH}/common_static/site/${CAPS_FAILED_SITE}/gfe ]; then
log_msg "Removing common site configuration for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/common_static/site/${CAPS_FAILED_SITE}/gfe
fi
if [ -d ${LOCALIZATION_PATH}/common_static/site/${CAPS_FAILED_SITE}/vtec ]; then
log_msg "Removing common site vtec configuration for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/common_static/site/${CAPS_FAILED_SITE}/vtec
fi
if [ -d ${LOCALIZATION_PATH}/edex_static/site/${CAPS_FAILED_SITE}/config/gfe ]; then
log_msg "Removing edex site configuration for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/edex_static/site/${CAPS_FAILED_SITE}/config/gfe
fi
if [ -d ${LOCALIZATION_PATH}/edex_static/site/${CAPS_FAILED_SITE}/smartinit ]; then
log_msg "Removing edex smartinit for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/edex_static/site/${CAPS_FAILED_SITE}/smartinit
fi
if [ -d ${LOCALIZATION_PATH}/cave_static/site/${CAPS_FAILED_SITE}/gfe ]; then
log_msg "Removing cave site configuration for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/cave_static/site/${SITE}/gfe
fi
if [ -d ${LOCALIZATION_PATH}/cave_static/site/${CAPS_FAILED_SITE}/bundles/maps ]; then
log_msg "Removing cave site maps configuration for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/cave_static/site/${CAPS_FAILED_SITE}/bundles/maps
fi
if [ -d ${LOCALIZATION_PATH}/cave_static/site/${CAPS_FAILED_SITE}/colormaps ]; then
log_msg "Removing cave site colormaps configuration for site ${CAPS_FAILED_SITE}"
rm -fr ${LOCALIZATION_PATH}/cave_static/site/${CAPS_FAILED_SITE}/colormaps
fi
# end DR 16362
# DR 16464
if [ -d /awips2/GFESuite/ServiceBackup/data/${CAPS_FAILED_SITE} ]; then
log_msg "Removing rsync_parms.site for site ${CAPS_FAILED_SITE}"
rm -f /awips2/GFESuite/ServiceBackup/data/rsync_parms.${CAPS_FAILED_SITE}
fi
# end DR 16464
#-- Remove the rsync grids
if [ "$CAPS_FAILED_SITE" = "aer" ]
then

View file

@ -47,6 +47,7 @@ log_msg Preparing configuration files for export...
edexDest=GFEconfig/edex_static
commonDest=GFEconfig/common_static
caveDest=GFEconfig/cave_static
rsyncParms=GFEConfig # DR 16464
log_msg 15
log_msg Making temporary edex configuration directories...
@ -61,6 +62,11 @@ log_msg Making temporary cave configuration directories
mkdir -p $caveDest/site
log_msg 30
# DR 16464
log_msg Making temporary rsync_parms directory
mkdir -p $rsyncParms/site
log_msg 35
# Copies the localization information to the staging area
log_msg Copying common site configuration for site ${CAPS_SITE} to temporary directory...
cp -r ${LOCALIZATION_PATH}/common_static/site/${CAPS_SITE}/gfe $commonDest/site
@ -88,6 +94,13 @@ log_msg Copying cave site colormaps configuration for site ${CAPS_SITE} to tempo
cp -r ${LOCALIZATION_PATH}/cave_static/site/${CAPS_SITE}/colormaps $caveDest/site
log_msg 80
# DR 16464
if [ -f /awips2/GFESuite/ServiceBackup/data/rsync_parms.${CAPS_SITE} ]; then
log_msg Copying the rsync_parms file for site ${CAPS_SITE} to temporary directory...
cp -a /awips2/GFESuite/ServiceBackup/data/rsync_parms.${CAPS_SITE} $rsyncParms/site
log_msg 83
fi
# Tar up everything.
log_msg 85
log_msg Tarring and zipping configuration to file GFEconfig.${SITE}.tar.gz

View file

@ -106,6 +106,7 @@ edex_site_dest=${LOCALIZATION_PATH}/edex_static/site/${SITE_CAPS}/config
edex_site_si_dest=${LOCALIZATION_PATH}/edex_static/site/${SITE_CAPS}
common_site_dest=${LOCALIZATION_PATH}/common_static/site/${SITE_CAPS}
cave_site_dest=${LOCALIZATION_PATH}/cave_static/site/${SITE_CAPS}
rsync_parms_dest=/awips2/GFESuite/ServiceBackup/data # DR 16464
if [ -d ${edex_site_dest} ]; then
log_msg "edex_static site directory exists for ${SITE_CAPS}"
@ -127,6 +128,14 @@ else
log_msg "Creating cave_static site directory for ${SITE_CAPS}"
mkdir -p ${cave_site_dest}
fi
# DR 16464
if [ -d ${rsync_parms_dest} ]; then
log_msg "rsync_parms_dest directory exists for ${SITE_CAPS}"
else
log_msg "Creating rsync_parms_dest directory for ${SITE_CAPS}"
mkdir -p ${rsync_parms_dest}
fi
log msg 59
log_msg "${SITE_CAPS}'s localization directories have been verified"
log_msg 60
@ -138,6 +147,9 @@ cp -r GFEconfig/edex_static/site/smartinit ${edex_site_si_dest}
log_msg 90
cp -r GFEconfig/cave_static/site/* ${cave_site_dest}
log_msg 93
# DR 16464
cp -a GFEConfig/site/rsync_parms.${SITE_CAPS} ${rsync_parms_dest}.${SITE_CAPS}
log_msg 94
log_msg "Files successfully copied!"
log_msg "Changing ownership of received configuration"
@ -146,6 +158,7 @@ then
chown -R awips:fxalpha ${LOCALIZATION_PATH}/edex_static/site/${SITE_CAPS}
chown -R awips:fxalpha ${LOCALIZATION_PATH}/common_static/site/${SITE_CAPS}
chown -R awips:fxalpha ${LOCALIZATION_PATH}/cave_static/site/${SITE_CAPS}
chown -R awips:fxalpha /awips2/GFESuite/ServiceBackup/data # DR 16464
elif [ $USER = "awips" ]
then
log_msg "Files already owned by awips"

View file

@ -8,7 +8,7 @@
# Authors: Virgil Middendorf (BYZ), Steve Sigler (MSO) #
# Contributers: Ahmad Garabi, Ken Sargeant, Dave Pike, Dave Rosenberg, #
# Tim Barker, Maureen Ballard, Jay Smith, Dave Tomalak, #
# Evelyn Bersack, Juliya Dynina, Jianning Zeng #
# Evelyn Bersack, Juliya Dynina, Jianning Zeng, John McPherson #
# #
# Date of last revision: 04/22/13 #
# #
@ -142,7 +142,10 @@
# the hard-coded path to /awips2/fxa/bin with $FXA_BIN. Removed #
# awips1 code. #
# 11/02/12: Restored error checking for AWIPS2. #
# 04/22/13: Update the permission of the log directories. #
# 04/22/13: Update the permission of the log directories. #
# 02/24/14: Create the file if rsync_parms.${site} is not available, #
# and mkdir the site directory on the local rsync server if it #
# does not exist. #
################################################################################
# check to see if site id was passed as argument
# if not then exit from the script
@ -161,14 +164,18 @@ fi
################################################################################
IFPS_DATA="/awips2/GFESuite/ServiceBackup/data"
IFPS_CREATE_FILE="/awips2/GFESuite/bin"
if [ ! -f ${IFPS_DATA}/rsync_parms.${site} ] ;then
echo "${IFPS_DATA}/rsync_parms.${site} does not exist!"
echo "Please contact your ITO to create this file from /awips2/GFESuite/bin/rsync_parms.ccc"
exit
else
. ${IFPS_DATA}/rsync_parms.${site}
cp ${IFPS_CREATE_FILE}/rsync_parms.ccc ${IFPS_DATA}/rsync_parms.${site}
# Added above line for DR 16464, just create file if it does not exist, do not error off
# echo "${IFPS_DATA}/rsync_parms.${site} does not exist!"
# echo "Please contact your ITO to create this file from /awips2/GFESuite/bin/rsync_parms.ccc"
# exit
fi
# else
. ${IFPS_DATA}/rsync_parms.${site}
# fi
################################################################################
@ -325,6 +332,11 @@ echo "space used in netcdf: $(cd ${WRKDIR}; du -m --max-depth=1) mb" >> $LOG_FI
echo ... finished >> $LOG_FILE
echo " " >> $LOG_FILE
# if directory to write to is not on local rysnc server, create it. DR 16464
if [ ! ssh ${locServer} 'ls "${locDirectory}" >/dev/null' ] ;then
ssh ${locServer} mkdir ${locDirectory}
fi
# Clean up orphaned files on the local rsync server.
echo cleaning up orphaned files on $locServer in the ${locDirectory}/${site} directory at $(date) >> $LOG_FILE
ssh $locServer "find ${locDirectory}/${site} -mmin +720 -exec rm {} -f \;"

View file

@ -1,5 +1,6 @@
package gov.noaa.nws.ncep.viz.gempak.nativelib;
import java.io.FileNotFoundException;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
@ -10,20 +11,47 @@ import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
/**
* Utility to load a specific native library
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------- -------- ----------- -----------------------------------------
* --/--/---- Initial Creation
* Mar 20, 2014 2919 njensen Safety checks, better error messages
*
* </pre>
*
*/
public class LibraryLoader {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(LibraryLoader.class);
public static void load(String libName) {
URL url = null;
Path path = null;
try {
Bundle b = Activator.getDefault().getBundle();
url = FileLocator.find(b, new Path(System.mapLibraryName(libName)),
null);
path = new Path(System.mapLibraryName(libName));
url = FileLocator.find(b, path, null);
if (url == null) {
throw new FileNotFoundException("Unable to locate "
+ path.toString());
}
url = FileLocator.resolve(url);
System.load(url.getPath());
} catch (Exception e) {
String msg = "Could not Load native Library: " + url.getFile();
String msg = "Could not load native Library: ";
if (url != null) {
msg += url.getFile();
} else {
msg += path.toString();
}
statusHandler.handle(Priority.PROBLEM, msg, e);
}
}