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
[formerly3575d6586f
[formerly bd13bc332bcdd87723bec8669885f4594ad483b9]] Former-commit-id:3575d6586f
Former-commit-id:cd51f3fa87
This commit is contained in:
commit
9b12d9ddaf
94 changed files with 2459 additions and 569 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
26
RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/mqsrvr/ReqObj.java
Executable file → Normal file
26
RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/mqsrvr/ReqObj.java
Executable file → Normal 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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
@ -237,9 +249,6 @@ public class Serv {
|
|||
MutableConfiguration mc = (MutableConfiguration) config;
|
||||
boolean result = mc.setGlobalConfig(global);
|
||||
|
||||
ConfigEvent ev = new ConfigEvent();
|
||||
server.handleConfigEvent(ev);
|
||||
|
||||
if (result)
|
||||
return null;
|
||||
else
|
||||
|
@ -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.";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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...
|
||||
|
@ -349,7 +381,12 @@ public class StandardConfig implements Configuration, MutableConfiguration {
|
|||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -114,14 +135,19 @@ 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,7 +580,21 @@ public class RPSListManager extends RadarEventAdapter {
|
|||
&& newCfg.isDedicated()
|
||||
&& (oldCfg.isCollectionEnabled() != newCfg
|
||||
.isCollectionEnabled())) {
|
||||
String radarID = newCfg.getRadarID();
|
||||
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;
|
||||
|
@ -589,7 +603,7 @@ public class RPSListManager extends RadarEventAdapter {
|
|||
currentVcps.remove(radarID);
|
||||
currentRpsLists.remove(radarID);
|
||||
if (gsmData != null) {
|
||||
handleGSM(newCfg, gsmData);
|
||||
handleGSM(rc, gsmData);
|
||||
} else {
|
||||
Log.debugf(
|
||||
"RPS-relevant configuration changed for %s, but "
|
||||
|
@ -598,5 +612,3 @@ public class RPSListManager extends RadarEventAdapter {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,8 +39,19 @@ 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 {
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -22,6 +22,16 @@
|
|||
<displayList>
|
||||
<displays xsi:type="mapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<descriptor xsi:type="mapDescriptor">
|
||||
<resource>
|
||||
<loadProperties>
|
||||
<capabilities>
|
||||
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
|
||||
<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" />
|
||||
<resourceData xsi:type="mapResourceGroupData">
|
||||
<resource>
|
||||
<loadProperties>
|
||||
<capabilities>
|
||||
|
@ -41,6 +51,26 @@
|
|||
<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>
|
||||
</descriptor>
|
||||
</displays>
|
||||
</displayList>
|
||||
|
|
|
@ -22,6 +22,16 @@
|
|||
<displayList>
|
||||
<displays xsi:type="mapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<descriptor xsi:type="mapDescriptor">
|
||||
<resource>
|
||||
<loadProperties>
|
||||
<capabilities>
|
||||
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
|
||||
<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" />
|
||||
<resourceData xsi:type="mapResourceGroupData">
|
||||
<resource>
|
||||
<loadProperties>
|
||||
<capabilities>
|
||||
|
@ -41,6 +51,26 @@
|
|||
<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>
|
||||
</descriptor>
|
||||
</displays>
|
||||
</displayList>
|
||||
|
|
|
@ -22,6 +22,16 @@
|
|||
<displayList>
|
||||
<displays xsi:type="mapRenderableDisplay" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<descriptor xsi:type="mapDescriptor">
|
||||
<resource>
|
||||
<loadProperties>
|
||||
<capabilities>
|
||||
<capability xsi:type="colorableCapability" colorAsString="#9b9b9b" />
|
||||
<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" />
|
||||
<resourceData xsi:type="mapResourceGroupData">
|
||||
<resource>
|
||||
<loadProperties>
|
||||
<capabilities>
|
||||
|
@ -43,6 +53,26 @@
|
|||
<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>
|
||||
</resourceData>
|
||||
</resource>
|
||||
</descriptor>
|
||||
</displays>
|
||||
</displayList>
|
||||
|
|
|
@ -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;
|
||||
|
@ -54,8 +55,9 @@ import com.raytheon.viz.ui.perspectives.IRenderableDisplayCustomizer;
|
|||
* SOFTWARE HISTORY
|
||||
*
|
||||
* 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) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
@ -299,6 +299,7 @@ public class FFMPDataGenerator {
|
|||
FFMPBasinMetaData fmdb = ft.getBasin(siteKey, key);
|
||||
|
||||
if (fmdb != null) {
|
||||
checkCenteredAggregationKey();// DR 16096 aggregation_county-huc_click
|
||||
for (DomainXML domain : domains) {
|
||||
if ((domain.getCwa().equals(fmdb.getCwa()))
|
||||
|| (domain.isPrimary() && fmdb
|
||||
|
@ -431,6 +432,7 @@ public class FFMPDataGenerator {
|
|||
}
|
||||
if (qpfRecord != null) {
|
||||
qpfBasin = qpfRecord.getBasinData();
|
||||
qpfBasinClone = qpfRecord.getBasinData();// DR 16096
|
||||
}
|
||||
if (guidRecords != null) {
|
||||
guidBasins = new HashMap<String, FFMPBasinData>();
|
||||
|
@ -466,4 +468,180 @@ 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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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>();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,6 +3694,9 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
|||
if (endIndex == -1) {
|
||||
endIndex = in.length();
|
||||
}
|
||||
boolean isWrapping = false;
|
||||
String thisSite = "";
|
||||
String lastLine = "";
|
||||
String line = in.substring(beginIndex, endIndex);
|
||||
int lineNumber = 1;
|
||||
Set<List<String>> keySet = results.keySet();
|
||||
|
@ -3700,6 +3708,10 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
|||
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) {
|
||||
beginIndex = endIndex + 1;
|
||||
|
@ -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) {
|
||||
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));
|
||||
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 = 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,11 +3812,21 @@ 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.
|
||||
*
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -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);
|
||||
|
@ -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,6 +356,7 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
|
|||
|
||||
if (dlgOpen <= 0) {
|
||||
Map<Object, Object> map = scriptDlg.getValues();
|
||||
|
||||
String returnMsg = "";
|
||||
|
||||
for (Map.Entry<Object, Object> entry : map.entrySet()) {
|
||||
|
@ -354,10 +364,14 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
|
|||
+ " ";
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
@ -79,6 +82,8 @@ import com.raytheon.viz.gfe.temporaleditor.TemporalEditor;
|
|||
public class GridManager implements IGridManager,
|
||||
ISpatialEditorTimeChangedListener {
|
||||
|
||||
private Date selectedTime = null;
|
||||
|
||||
private class RedrawRunnable implements Runnable {
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -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,6 +773,9 @@ public class GridManager implements IGridManager,
|
|||
}
|
||||
|
||||
protected void syncSelectTR(Date t) {
|
||||
// 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.
|
||||
|
@ -794,6 +804,11 @@ public class GridManager implements IGridManager,
|
|||
dataManager.getParmOp().setSelectionTimeRange(tr);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// reset
|
||||
selectedTime = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the lockSelectionTRtoTimeStep
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,7 +435,14 @@ 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);
|
||||
|
||||
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -360,6 +362,8 @@ public class DisplayMeanArealPrecipResource extends
|
|||
|
||||
Set<DisplayMode> mode = displayMgr.getDisplayMode();
|
||||
|
||||
target = aTarget;
|
||||
|
||||
if (mode.contains(DisplayMode.Image)) {
|
||||
if (gridDisplay == null) {
|
||||
gridDisplay = new GriddedImageDisplay2(buf2, gridGeometry, this);
|
||||
|
|
|
@ -80,6 +80,9 @@ import com.raytheon.viz.mpe.ui.rsc.MPEFieldResourceData.MPEFieldFrame;
|
|||
* 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.
|
||||
* 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 {
|
||||
|
@ -436,6 +433,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) {
|
||||
short value = data[i];
|
||||
|
|
|
@ -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
|
||||
|
@ -144,21 +146,9 @@ public class MeanMonthlyPrecip {
|
|||
float f = 0;
|
||||
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;
|
||||
f = 0;
|
||||
} else {
|
||||
f = (float) cmc.getDataToDisplayConverter()
|
||||
.convert(s);
|
||||
}
|
||||
} 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;
|
||||
|
|
|
@ -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>
|
||||
*
|
||||
|
@ -1089,6 +1090,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
*/
|
||||
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,6 +2059,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
overStrikeItem.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
if (!AFOSParser.isTemplate) {
|
||||
if (overwriteMode == true) {
|
||||
overwriteMode = false;
|
||||
editorInsertCmb.select(INSERT_TEXT);
|
||||
|
@ -2061,6 +2069,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
}
|
||||
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -3699,19 +3708,21 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
editorInsertCmb.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
if ((editorInsertCmb.getSelectionIndex() == INSERT_TEXT)
|
||||
&& (overwriteMode == 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)) {
|
||||
} else if (editorInsertCmb.getSelectionIndex() == OVERWRITE_TEXT
|
||||
&& overwriteMode == false) {
|
||||
textEditor.invokeAction(ST.TOGGLE_OVERWRITE);
|
||||
overwriteMode = true;
|
||||
overStrikeItem.setSelection(true);
|
||||
}
|
||||
textEditor.setFocus();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
editorBtnRowComp.layout();
|
||||
|
@ -3870,6 +3881,7 @@ 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 (AFOSParser.isTemplate) {
|
||||
if (overwriteMode == true) {
|
||||
overwriteMode = false;
|
||||
overStrikeItem.setSelection(false);
|
||||
|
@ -3880,6 +3892,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
editorInsertCmb.select(OVERWRITE_TEXT);
|
||||
}
|
||||
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)
|
||||
|
@ -5121,6 +5200,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
}
|
||||
body.append(textEditor.getText().trim());
|
||||
|
||||
if (AFOSParser.isTemplate){
|
||||
return removePreformat(body.toString());
|
||||
}
|
||||
|
||||
return body.toString();
|
||||
}
|
||||
|
||||
|
@ -5251,6 +5334,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
+ 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(.*)|...)");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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> getAllCountyUgcs() throws Exception {
|
||||
GeospatialDataAccessor gda = getCountyGeospatialDataAcessor();
|
||||
public Set<String> getAllUgcs() throws Exception {
|
||||
GeospatialDataAccessor gda;
|
||||
Set<String> ugcs = new HashSet<String>();
|
||||
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;
|
||||
}
|
||||
|
||||
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()
|
||||
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());
|
||||
state.strings.put(center, "W");
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,9 +1225,17 @@ public class TemplateRunner {
|
|||
if (!work.valid) {
|
||||
continue;
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rval;
|
||||
|
@ -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 = "";
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()]));
|
||||
}
|
||||
if (!countyOrMarine.equals("Marine")) {
|
||||
curState = range.substring(0, 2);
|
||||
} else {
|
||||
curState = "";
|
||||
}
|
||||
curList = new ArrayList<String>();
|
||||
range = range.substring(3);
|
||||
}
|
||||
|
|
|
@ -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+*+*+*+?
|
||||
|
|
|
@ -263,6 +263,13 @@
|
|||
<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">
|
||||
<from uri="timer://jmsPooledResourceCheck?period=60s" />
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
if (!dataValue.equals(ShefConstants.SHEF_MISSING)) {
|
||||
adjustRawValue(locId, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* multiply non-missing values of discharge values and unspecified
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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}"/>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
||||
<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>
|
|
@ -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(".");
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
@ -454,6 +455,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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) };
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
@ -206,7 +207,7 @@ ${dateUtil.period(${watches.getLatestTorTime()},${timeFormat.plain}, 15, ${local
|
|||
#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)
|
||||
|
@ -240,7 +241,7 @@ ${dateUtil.period(${watches.getLatestSvrTime()},${timeFormat.plain}, 15, ${local
|
|||
#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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: "
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,15 +447,10 @@ 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 {
|
||||
soundingList.clear();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
soundingList.clear();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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
|
||||
|
@ -167,6 +168,8 @@ public class MadisPointDataTransform {
|
|||
|
||||
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,
|
||||
RH_QCR, ALTIMETER, ALTIMETER_QCD, ALTIMETER_QCA, ALTIMETER_QCR,
|
||||
|
@ -250,9 +253,6 @@ public class MadisPointDataTransform {
|
|||
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());
|
||||
|
@ -314,71 +314,6 @@ public class MadisPointDataTransform {
|
|||
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) {
|
||||
|
||||
|
@ -508,9 +441,18 @@ public class MadisPointDataTransform {
|
|||
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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 #
|
||||
# #
|
||||
|
@ -143,6 +143,9 @@
|
|||
# awips1 code. #
|
||||
# 11/02/12: Restored error checking for AWIPS2. #
|
||||
# 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 \;"
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue