rcap 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{CHANGELOG.rdoc → CHANGELOG.md} +26 -20
- data/README.md +259 -0
- data/Rakefile +8 -7
- data/lib/extensions/array.rb +7 -1
- data/lib/extensions/date_time.rb +5 -1
- data/lib/extensions/string.rb +14 -1
- data/lib/extensions/time.rb +5 -1
- data/lib/rcap.rb +1 -1
- data/lib/rcap/alert.rb +24 -10
- data/lib/rcap/cap_1_0/alert.rb +232 -166
- data/lib/rcap/cap_1_0/area.rb +100 -67
- data/lib/rcap/cap_1_0/circle.rb +47 -22
- data/lib/rcap/cap_1_0/event_code.rb +3 -2
- data/lib/rcap/cap_1_0/geocode.rb +3 -2
- data/lib/rcap/cap_1_0/info.rb +265 -202
- data/lib/rcap/cap_1_0/parameter.rb +43 -20
- data/lib/rcap/cap_1_0/point.rb +23 -9
- data/lib/rcap/cap_1_0/polygon.rb +37 -19
- data/lib/rcap/cap_1_0/resource.rb +77 -55
- data/lib/rcap/cap_1_1/alert.rb +222 -156
- data/lib/rcap/cap_1_1/area.rb +100 -67
- data/lib/rcap/cap_1_1/circle.rb +49 -22
- data/lib/rcap/cap_1_1/event_code.rb +3 -2
- data/lib/rcap/cap_1_1/geocode.rb +3 -2
- data/lib/rcap/cap_1_1/info.rb +281 -217
- data/lib/rcap/cap_1_1/parameter.rb +35 -16
- data/lib/rcap/cap_1_1/point.rb +23 -9
- data/lib/rcap/cap_1_1/polygon.rb +38 -20
- data/lib/rcap/cap_1_1/resource.rb +106 -65
- data/lib/rcap/cap_1_2/alert.rb +224 -158
- data/lib/rcap/cap_1_2/area.rb +100 -67
- data/lib/rcap/cap_1_2/circle.rb +49 -24
- data/lib/rcap/cap_1_2/event_code.rb +3 -2
- data/lib/rcap/cap_1_2/geocode.rb +3 -2
- data/lib/rcap/cap_1_2/info.rb +285 -219
- data/lib/rcap/cap_1_2/parameter.rb +39 -19
- data/lib/rcap/cap_1_2/point.rb +23 -9
- data/lib/rcap/cap_1_2/polygon.rb +37 -20
- data/lib/rcap/cap_1_2/resource.rb +107 -67
- data/lib/rcap/config.rb +4 -0
- data/lib/rcap/utilities.rb +55 -2
- data/lib/rcap/validations.rb +2 -2
- data/lib/rcap/version.rb +1 -1
- data/rcap.gemspec +2 -2
- data/spec/cap_1_0/parameter_spec.rb +5 -1
- data/spec/cap_1_1/resource_spec.rb +6 -0
- data/spec/cap_1_2/alert_spec.rb +8 -0
- data/spec/cap_1_2/resource_spec.rb +8 -2
- metadata +11 -10
- data/README.rdoc +0 -247
- data/lib/config.rb +0 -2
data/lib/rcap/cap_1_2/alert.rb
CHANGED
@@ -14,82 +14,58 @@ module RCAP
|
|
14
14
|
XMLNS = "urn:oasis:names:tc:emergency:cap:1.2"
|
15
15
|
CAP_VERSION = "1.2"
|
16
16
|
|
17
|
-
STATUS_ACTUAL = "Actual"
|
18
|
-
STATUS_EXERCISE = "Exercise"
|
19
|
-
STATUS_SYSTEM = "System"
|
20
|
-
STATUS_TEST = "Test"
|
21
|
-
STATUS_DRAFT = "Draft"
|
17
|
+
STATUS_ACTUAL = "Actual"
|
18
|
+
STATUS_EXERCISE = "Exercise"
|
19
|
+
STATUS_SYSTEM = "System"
|
20
|
+
STATUS_TEST = "Test"
|
21
|
+
STATUS_DRAFT = "Draft"
|
22
22
|
# Valid values for status
|
23
23
|
VALID_STATUSES = [ STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT ]
|
24
24
|
|
25
|
-
MSG_TYPE_ALERT = "Alert"
|
26
|
-
MSG_TYPE_UPDATE = "Update"
|
27
|
-
MSG_TYPE_CANCEL = "Cancel"
|
28
|
-
MSG_TYPE_ACK = "Ack"
|
29
|
-
MSG_TYPE_ERROR = "Error"
|
25
|
+
MSG_TYPE_ALERT = "Alert"
|
26
|
+
MSG_TYPE_UPDATE = "Update"
|
27
|
+
MSG_TYPE_CANCEL = "Cancel"
|
28
|
+
MSG_TYPE_ACK = "Ack"
|
29
|
+
MSG_TYPE_ERROR = "Error"
|
30
30
|
# Valid values for msg_type
|
31
31
|
VALID_MSG_TYPES = [ MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR ]
|
32
32
|
|
33
|
-
SCOPE_PUBLIC = "Public"
|
34
|
-
SCOPE_RESTRICTED = "Restricted"
|
35
|
-
SCOPE_PRIVATE = "Private"
|
33
|
+
SCOPE_PUBLIC = "Public"
|
34
|
+
SCOPE_RESTRICTED = "Restricted"
|
35
|
+
SCOPE_PRIVATE = "Private"
|
36
36
|
# Valid values for scope
|
37
37
|
VALID_SCOPES = [ SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED ]
|
38
38
|
|
39
|
-
|
40
|
-
IDENTIFIER_ELEMENT_NAME = 'identifier' # :nodoc:
|
41
|
-
SENDER_ELEMENT_NAME = 'sender' # :nodoc:
|
42
|
-
SENT_ELEMENT_NAME = 'sent' # :nodoc:
|
43
|
-
STATUS_ELEMENT_NAME = 'status' # :nodoc:
|
44
|
-
MSG_TYPE_ELEMENT_NAME = 'msgType' # :nodoc:
|
45
|
-
SOURCE_ELEMENT_NAME = 'source' # :nodoc:
|
46
|
-
SCOPE_ELEMENT_NAME = 'scope' # :nodoc:
|
47
|
-
RESTRICTION_ELEMENT_NAME = 'restriction' # :nodoc:
|
48
|
-
ADDRESSES_ELEMENT_NAME = 'addresses' # :nodoc:
|
49
|
-
CODE_ELEMENT_NAME = 'code' # :nodoc:
|
50
|
-
NOTE_ELEMENT_NAME = 'note' # :nodoc:
|
51
|
-
REFERENCES_ELEMENT_NAME = 'references' # :nodoc:
|
52
|
-
INCIDENTS_ELEMENT_NAME = 'incidents' # :nodoc:
|
53
|
-
|
54
|
-
XPATH = 'cap:alert' # :nodoc:
|
55
|
-
IDENTIFIER_XPATH = "cap:#{ IDENTIFIER_ELEMENT_NAME }" # :nodoc:
|
56
|
-
SENDER_XPATH = "cap:#{ SENDER_ELEMENT_NAME }" # :nodoc:
|
57
|
-
SENT_XPATH = "cap:#{ SENT_ELEMENT_NAME }" # :nodoc:
|
58
|
-
STATUS_XPATH = "cap:#{ STATUS_ELEMENT_NAME }" # :nodoc:
|
59
|
-
MSG_TYPE_XPATH = "cap:#{ MSG_TYPE_ELEMENT_NAME }" # :nodoc:
|
60
|
-
SOURCE_XPATH = "cap:#{ SOURCE_ELEMENT_NAME }" # :nodoc:
|
61
|
-
SCOPE_XPATH = "cap:#{ SCOPE_ELEMENT_NAME }" # :nodoc:
|
62
|
-
RESTRICTION_XPATH = "cap:#{ RESTRICTION_ELEMENT_NAME }" # :nodoc:
|
63
|
-
ADDRESSES_XPATH = "cap:#{ ADDRESSES_ELEMENT_NAME }" # :nodoc:
|
64
|
-
CODE_XPATH = "cap:#{ CODE_ELEMENT_NAME }" # :nodoc:
|
65
|
-
NOTE_XPATH = "cap:#{ NOTE_ELEMENT_NAME }" # :nodoc:
|
66
|
-
REFERENCES_XPATH = "cap:#{ REFERENCES_ELEMENT_NAME }" # :nodoc:
|
67
|
-
INCIDENTS_XPATH = "cap:#{ INCIDENTS_ELEMENT_NAME }" # :nodoc:
|
68
|
-
|
69
|
-
# If not set a UUID will be set by default
|
39
|
+
# @return [String] If not set a UUID will be set by default
|
70
40
|
attr_accessor( :identifier)
|
41
|
+
# @return [String]
|
71
42
|
attr_accessor( :sender )
|
72
|
-
#
|
43
|
+
# @return [DateTime] If not set will value will be time of creation.
|
73
44
|
attr_accessor( :sent )
|
74
|
-
#
|
45
|
+
# @return [String] Can only be one of {VALID_STATUSES}
|
75
46
|
attr_accessor( :status )
|
76
|
-
#
|
47
|
+
# @return [String] Can only be one of {VALID_MSG_TYPES}
|
77
48
|
attr_accessor( :msg_type )
|
78
|
-
#
|
49
|
+
# @return [String]
|
50
|
+
attr_accessor( :password )
|
51
|
+
# @return [String] Can only be one of {VALID_SCOPES}
|
79
52
|
attr_accessor( :scope )
|
53
|
+
# @return [String]
|
80
54
|
attr_accessor( :source )
|
81
|
-
# Depends on scope being SCOPE_RESTRICTED
|
55
|
+
# @return [String ] Depends on scope being {SCOPE_RESTRICTED}
|
82
56
|
attr_accessor( :restriction )
|
57
|
+
# @return [String]
|
83
58
|
attr_accessor( :note )
|
84
59
|
|
85
|
-
# Collection of address strings. Depends on scope being SCOPE_PRIVATE
|
60
|
+
# @return [Array<String>] Collection of address strings. Depends on scope being {SCOPE_PRIVATE}
|
86
61
|
attr_reader( :addresses )
|
62
|
+
# @return [Array<String>]
|
87
63
|
attr_reader( :codes )
|
88
|
-
#
|
64
|
+
# @return [Array<String>] See {#to_reference}
|
89
65
|
attr_reader( :references)
|
90
|
-
# Collection of incident strings
|
66
|
+
# @return [Array<String>] Collection of incident strings
|
91
67
|
attr_reader( :incidents )
|
92
|
-
# Collection of Info objects
|
68
|
+
# @return [Array<Info>] Collection of {Info} objects
|
93
69
|
attr_reader( :infos )
|
94
70
|
|
95
71
|
validates_presence_of( :identifier, :sender, :sent, :status, :msg_type, :scope )
|
@@ -106,6 +82,28 @@ module RCAP
|
|
106
82
|
|
107
83
|
validates_collection_of( :infos )
|
108
84
|
|
85
|
+
# @example
|
86
|
+
# Alert.new( sender: 'disaster_management@cape_town.municipal.za',
|
87
|
+
# sent: Date.today,
|
88
|
+
# status: Alert::STATUS_ACTUAL,
|
89
|
+
# msg_type: Alert::MSG_TYPE_ALERT,
|
90
|
+
# scope: Alert::SCOPE_PUBLIC )
|
91
|
+
#
|
92
|
+
# @param [Hash] attributes
|
93
|
+
# @option attributes [String] :identifier Unique identifier - autogenerated if not given
|
94
|
+
# @option attributes [String] :sender
|
95
|
+
# @option attributes [DateTime] :sent
|
96
|
+
# @option attributes [String] :status A member of {VALID_STATUSES}
|
97
|
+
# @option attributes [String] :msg_type A member of {VALID_MSG_TYPES}
|
98
|
+
# @option attributes [String] :password
|
99
|
+
# @option attributes [String] :scope A member of {VALID_SCOPES}
|
100
|
+
# @option attributes [String] :source
|
101
|
+
# @option attributes [String] :restriction
|
102
|
+
# @option attributes [Array<String>] :addresses
|
103
|
+
# @option attributes [Array<String>] :codes
|
104
|
+
# @option attributes [Array<String>] :references see {#to_reference}
|
105
|
+
# @option attributes [Array<String>] :incidents
|
106
|
+
# @option attributes [Array<Info>] :infos
|
109
107
|
def initialize( attributes = {})
|
110
108
|
@identifier = attributes[ :identifier ] || RCAP.generate_identifier
|
111
109
|
@sender = attributes[ :sender ]
|
@@ -122,45 +120,65 @@ module RCAP
|
|
122
120
|
@infos = Array( attributes[ :infos ])
|
123
121
|
end
|
124
122
|
|
125
|
-
# Creates a new Info object and adds it to the infos array.
|
126
|
-
#
|
127
|
-
|
123
|
+
# Creates a new {Info} object and adds it to the {#infos array}.
|
124
|
+
#
|
125
|
+
# @see Info#initialize
|
126
|
+
# @param [Hash] info_attributes Info attributes - see {Info#initialize}
|
127
|
+
# @return [Info]
|
128
|
+
def add_info( info_attributes = {})
|
128
129
|
info = Info.new( info_attributes )
|
129
|
-
|
130
|
+
@infos << info
|
130
131
|
info
|
131
132
|
end
|
132
133
|
|
133
|
-
|
134
|
+
XML_ELEMENT_NAME = 'alert'
|
135
|
+
IDENTIFIER_ELEMENT_NAME = 'identifier'
|
136
|
+
SENDER_ELEMENT_NAME = 'sender'
|
137
|
+
SENT_ELEMENT_NAME = 'sent'
|
138
|
+
STATUS_ELEMENT_NAME = 'status'
|
139
|
+
MSG_TYPE_ELEMENT_NAME = 'msgType'
|
140
|
+
SOURCE_ELEMENT_NAME = 'source'
|
141
|
+
SCOPE_ELEMENT_NAME = 'scope'
|
142
|
+
RESTRICTION_ELEMENT_NAME = 'restriction'
|
143
|
+
ADDRESSES_ELEMENT_NAME = 'addresses'
|
144
|
+
CODE_ELEMENT_NAME = 'code'
|
145
|
+
NOTE_ELEMENT_NAME = 'note'
|
146
|
+
REFERENCES_ELEMENT_NAME = 'references'
|
147
|
+
INCIDENTS_ELEMENT_NAME = 'incidents'
|
148
|
+
|
149
|
+
# @return [REXML::Element]
|
150
|
+
def to_xml_element
|
134
151
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
135
152
|
xml_element.add_namespace( XMLNS )
|
136
|
-
xml_element.add_element( IDENTIFIER_ELEMENT_NAME ).add_text(
|
137
|
-
xml_element.add_element( SENDER_ELEMENT_NAME ).add_text(
|
138
|
-
xml_element.add_element( SENT_ELEMENT_NAME ).add_text(
|
139
|
-
xml_element.add_element( STATUS_ELEMENT_NAME ).add_text(
|
140
|
-
xml_element.add_element( MSG_TYPE_ELEMENT_NAME ).add_text(
|
141
|
-
xml_element.add_element( SOURCE_ELEMENT_NAME ).add_text(
|
142
|
-
xml_element.add_element( SCOPE_ELEMENT_NAME ).add_text(
|
143
|
-
xml_element.add_element( RESTRICTION_ELEMENT_NAME ).add_text(
|
144
|
-
|
145
|
-
xml_element.add_element( ADDRESSES_ELEMENT_NAME ).add_text(
|
153
|
+
xml_element.add_element( IDENTIFIER_ELEMENT_NAME ).add_text( @identifier ) if @identifier
|
154
|
+
xml_element.add_element( SENDER_ELEMENT_NAME ).add_text( @sender ) if @sender
|
155
|
+
xml_element.add_element( SENT_ELEMENT_NAME ).add_text( @sent.to_s_for_cap ) if @sent
|
156
|
+
xml_element.add_element( STATUS_ELEMENT_NAME ).add_text( @status ) if @status
|
157
|
+
xml_element.add_element( MSG_TYPE_ELEMENT_NAME ).add_text( @msg_type ) if @msg_type
|
158
|
+
xml_element.add_element( SOURCE_ELEMENT_NAME ).add_text( @source ) if @source
|
159
|
+
xml_element.add_element( SCOPE_ELEMENT_NAME ).add_text( @scope ) if @scope
|
160
|
+
xml_element.add_element( RESTRICTION_ELEMENT_NAME ).add_text( @restriction ) if @restriction
|
161
|
+
if @addresses.any?
|
162
|
+
xml_element.add_element( ADDRESSES_ELEMENT_NAME ).add_text( @addresses.to_s_for_cap )
|
146
163
|
end
|
147
|
-
|
164
|
+
@codes.each do |code|
|
148
165
|
xml_element.add_element( CODE_ELEMENT_NAME ).add_text( code )
|
149
166
|
end
|
150
|
-
xml_element.add_element( NOTE_ELEMENT_NAME ).add_text(
|
151
|
-
|
152
|
-
xml_element.add_element( REFERENCES_ELEMENT_NAME ).add_text(
|
167
|
+
xml_element.add_element( NOTE_ELEMENT_NAME ).add_text( @note ) if @note
|
168
|
+
if @references.any?
|
169
|
+
xml_element.add_element( REFERENCES_ELEMENT_NAME ).add_text( @references.join( ' ' ))
|
153
170
|
end
|
154
|
-
|
155
|
-
xml_element.add_element( INCIDENTS_ELEMENT_NAME ).add_text(
|
171
|
+
if @incidents.any?
|
172
|
+
xml_element.add_element( INCIDENTS_ELEMENT_NAME ).add_text( @incidents.join( ' ' ))
|
156
173
|
end
|
157
|
-
|
174
|
+
@infos.each do |info|
|
158
175
|
xml_element.add_element( info.to_xml_element )
|
159
176
|
end
|
160
177
|
xml_element
|
161
178
|
end
|
162
179
|
|
163
|
-
|
180
|
+
# @return [REXML::Document]
|
181
|
+
def to_xml_document
|
164
182
|
xml_document = REXML::Document.new
|
165
183
|
xml_document.add( REXML::XMLDecl.new )
|
166
184
|
xml_document.add( self.to_xml_element )
|
@@ -168,10 +186,13 @@ module RCAP
|
|
168
186
|
end
|
169
187
|
|
170
188
|
# Returns a string containing the XML representation of the alert.
|
189
|
+
#
|
190
|
+
# @param [true,false] pretty_print Pretty print output
|
191
|
+
# @return [String]
|
171
192
|
def to_xml( pretty_print = false )
|
172
193
|
if pretty_print
|
173
194
|
xml_document = ""
|
174
|
-
XML_PRETTY_PRINTER.write( self.to_xml_document, xml_document )
|
195
|
+
RCAP::XML_PRETTY_PRINTER.write( self.to_xml_document, xml_document )
|
175
196
|
xml_document
|
176
197
|
else
|
177
198
|
self.to_xml_document.to_s
|
@@ -180,39 +201,61 @@ module RCAP
|
|
180
201
|
|
181
202
|
# Returns a string representation of the alert suitable for usage as a reference in a CAP message of the form
|
182
203
|
# sender,identifier,sent
|
204
|
+
#
|
205
|
+
# @return [String]
|
183
206
|
def to_reference
|
184
|
-
"#{
|
207
|
+
"#{ @sender },#{ @identifier },#{ @sent }"
|
185
208
|
end
|
186
209
|
|
187
|
-
|
210
|
+
# @return [String]
|
211
|
+
def inspect
|
188
212
|
alert_inspect = [ "CAP Version: #{ CAP_VERSION }",
|
189
|
-
"Identifier: #{
|
190
|
-
"Sender: #{
|
191
|
-
"Sent: #{
|
192
|
-
"Status: #{
|
193
|
-
"Message Type: #{
|
194
|
-
"Source: #{
|
195
|
-
"Scope: #{
|
196
|
-
"Restriction: #{
|
197
|
-
"Addresses: #{
|
213
|
+
"Identifier: #{ @identifier }",
|
214
|
+
"Sender: #{ @sender }",
|
215
|
+
"Sent: #{ @sent }",
|
216
|
+
"Status: #{ @status }",
|
217
|
+
"Message Type: #{ @msg_type }",
|
218
|
+
"Source: #{ @source }",
|
219
|
+
"Scope: #{ @scope }",
|
220
|
+
"Restriction: #{ @restriction }",
|
221
|
+
"Addresses: #{ @addresses.to_s_for_cap }",
|
198
222
|
"Codes:",
|
199
|
-
|
200
|
-
"Note: #{
|
201
|
-
"References: #{
|
202
|
-
"Incidents: #{
|
223
|
+
@codes.map{ |code| " " + code }.join("\n")+"",
|
224
|
+
"Note: #{ @note }",
|
225
|
+
"References: #{ @references.join( ' ' )}",
|
226
|
+
"Incidents: #{ @incidents.join( ' ')}",
|
203
227
|
"Information:",
|
204
|
-
|
228
|
+
@infos.map{ |info| " " + info.to_s }.join( "\n" )].join( "\n" )
|
205
229
|
RCAP.format_lines_for_inspect( 'ALERT', alert_inspect )
|
206
230
|
end
|
207
231
|
|
208
232
|
# Returns a string representation of the alert of the form
|
209
233
|
# sender/identifier/sent
|
210
|
-
# See
|
234
|
+
# See {#to_reference} for another string representation suitable as a CAP reference.
|
235
|
+
#
|
236
|
+
# @return [String]
|
211
237
|
def to_s
|
212
|
-
"#{
|
238
|
+
"#{ @sender }/#{ @identifier }/#{ @sent }"
|
213
239
|
end
|
214
240
|
|
215
|
-
|
241
|
+
XPATH = 'cap:alert'
|
242
|
+
IDENTIFIER_XPATH = "cap:#{ IDENTIFIER_ELEMENT_NAME }"
|
243
|
+
SENDER_XPATH = "cap:#{ SENDER_ELEMENT_NAME }"
|
244
|
+
SENT_XPATH = "cap:#{ SENT_ELEMENT_NAME }"
|
245
|
+
STATUS_XPATH = "cap:#{ STATUS_ELEMENT_NAME }"
|
246
|
+
MSG_TYPE_XPATH = "cap:#{ MSG_TYPE_ELEMENT_NAME }"
|
247
|
+
SOURCE_XPATH = "cap:#{ SOURCE_ELEMENT_NAME }"
|
248
|
+
SCOPE_XPATH = "cap:#{ SCOPE_ELEMENT_NAME }"
|
249
|
+
RESTRICTION_XPATH = "cap:#{ RESTRICTION_ELEMENT_NAME }"
|
250
|
+
ADDRESSES_XPATH = "cap:#{ ADDRESSES_ELEMENT_NAME }"
|
251
|
+
CODE_XPATH = "cap:#{ CODE_ELEMENT_NAME }"
|
252
|
+
NOTE_XPATH = "cap:#{ NOTE_ELEMENT_NAME }"
|
253
|
+
REFERENCES_XPATH = "cap:#{ REFERENCES_ELEMENT_NAME }"
|
254
|
+
INCIDENTS_XPATH = "cap:#{ INCIDENTS_ELEMENT_NAME }"
|
255
|
+
|
256
|
+
# @param [REXML::Element] alert_xml_element
|
257
|
+
# @return [Alert]
|
258
|
+
def self.from_xml_element( alert_xml_element )
|
216
259
|
self.new( :identifier => RCAP.xpath_text( alert_xml_element, IDENTIFIER_XPATH, Alert::XMLNS ),
|
217
260
|
:sender => RCAP.xpath_text( alert_xml_element, SENDER_XPATH, Alert::XMLNS ),
|
218
261
|
:sent => (( sent = RCAP.xpath_first( alert_xml_element, SENT_XPATH, Alert::XMLNS )) ? DateTime.parse( sent.text ) : nil ),
|
@@ -229,58 +272,70 @@ module RCAP
|
|
229
272
|
:infos => RCAP.xpath_match( alert_xml_element, Info::XPATH, Alert::XMLNS ).map{ |element| Info.from_xml_element( element )})
|
230
273
|
end
|
231
274
|
|
232
|
-
|
275
|
+
# @param [REXML::Document] xml_document
|
276
|
+
# @return [Alert]
|
277
|
+
def self.from_xml_document( xml_document )
|
233
278
|
self.from_xml_element( xml_document.root )
|
234
279
|
end
|
235
280
|
|
236
281
|
# Initialise an Alert object from an XML string. Any object that is a subclass of IO (e.g. File) can be passed in.
|
282
|
+
#
|
283
|
+
# @param [String] xml
|
284
|
+
# @return [Alert]
|
237
285
|
def self.from_xml( xml )
|
238
286
|
self.from_xml_document( REXML::Document.new( xml ))
|
239
287
|
end
|
240
288
|
|
241
|
-
CAP_VERSION_YAML = "CAP Version"
|
242
|
-
IDENTIFIER_YAML = "Identifier"
|
243
|
-
SENDER_YAML = "Sender"
|
244
|
-
SENT_YAML = "Sent"
|
245
|
-
STATUS_YAML = "Status"
|
246
|
-
MSG_TYPE_YAML = "Message Type"
|
247
|
-
SOURCE_YAML = "Source"
|
248
|
-
SCOPE_YAML = "Scope"
|
249
|
-
RESTRICTION_YAML = "Restriction"
|
250
|
-
ADDRESSES_YAML = "Addresses"
|
251
|
-
CODES_YAML = "Codes"
|
252
|
-
NOTE_YAML = "Note"
|
253
|
-
REFERENCES_YAML = "References"
|
254
|
-
INCIDENTS_YAML = "Incidents"
|
255
|
-
INFOS_YAML = "Information"
|
289
|
+
CAP_VERSION_YAML = "CAP Version"
|
290
|
+
IDENTIFIER_YAML = "Identifier"
|
291
|
+
SENDER_YAML = "Sender"
|
292
|
+
SENT_YAML = "Sent"
|
293
|
+
STATUS_YAML = "Status"
|
294
|
+
MSG_TYPE_YAML = "Message Type"
|
295
|
+
SOURCE_YAML = "Source"
|
296
|
+
SCOPE_YAML = "Scope"
|
297
|
+
RESTRICTION_YAML = "Restriction"
|
298
|
+
ADDRESSES_YAML = "Addresses"
|
299
|
+
CODES_YAML = "Codes"
|
300
|
+
NOTE_YAML = "Note"
|
301
|
+
REFERENCES_YAML = "References"
|
302
|
+
INCIDENTS_YAML = "Incidents"
|
303
|
+
INFOS_YAML = "Information"
|
256
304
|
|
257
305
|
# Returns a string containing the YAML representation of the alert.
|
306
|
+
#
|
307
|
+
# @return [String]
|
258
308
|
def to_yaml( options = {} )
|
259
309
|
RCAP.attribute_values_to_hash(
|
260
|
-
[ CAP_VERSION_YAML,
|
261
|
-
[ IDENTIFIER_YAML,
|
262
|
-
[ SENDER_YAML,
|
263
|
-
[ SENT_YAML,
|
264
|
-
[ STATUS_YAML,
|
265
|
-
[ MSG_TYPE_YAML,
|
266
|
-
[ SOURCE_YAML,
|
267
|
-
[ SCOPE_YAML,
|
268
|
-
[ RESTRICTION_YAML,
|
269
|
-
[ ADDRESSES_YAML,
|
270
|
-
[ CODES_YAML,
|
271
|
-
[ NOTE_YAML,
|
272
|
-
[ REFERENCES_YAML,
|
273
|
-
[ INCIDENTS_YAML,
|
274
|
-
[ INFOS_YAML,
|
310
|
+
[ CAP_VERSION_YAML, CAP_VERSION ],
|
311
|
+
[ IDENTIFIER_YAML, @identifier ],
|
312
|
+
[ SENDER_YAML, @sender ],
|
313
|
+
[ SENT_YAML, @sent ],
|
314
|
+
[ STATUS_YAML, @status ],
|
315
|
+
[ MSG_TYPE_YAML, @msg_type ],
|
316
|
+
[ SOURCE_YAML, @source ],
|
317
|
+
[ SCOPE_YAML, @scope ],
|
318
|
+
[ RESTRICTION_YAML, @restriction ],
|
319
|
+
[ ADDRESSES_YAML, @addresses ],
|
320
|
+
[ CODES_YAML, @codes ],
|
321
|
+
[ NOTE_YAML, @note ],
|
322
|
+
[ REFERENCES_YAML, @references ],
|
323
|
+
[ INCIDENTS_YAML, @incidents ],
|
324
|
+
[ INFOS_YAML, @infos ]
|
275
325
|
).to_yaml( options )
|
276
326
|
end
|
277
327
|
|
278
328
|
# Initialise an Alert object from a YAML string. Any object that is a subclass of IO (e.g. File) can be passed in.
|
329
|
+
#
|
330
|
+
# @param [String] yaml
|
331
|
+
# @return [Alert]
|
279
332
|
def self.from_yaml( yaml )
|
280
333
|
self.from_yaml_data( YAML.load( yaml ))
|
281
334
|
end
|
282
335
|
|
283
|
-
|
336
|
+
# @param [Hash] yaml_data
|
337
|
+
# @return [Alert]
|
338
|
+
def self.from_yaml_data( alert_yaml_data )
|
284
339
|
Alert.new(
|
285
340
|
:identifier => alert_yaml_data[ IDENTIFIER_YAML ],
|
286
341
|
:sender => alert_yaml_data[ SENDER_YAML ],
|
@@ -299,42 +354,47 @@ module RCAP
|
|
299
354
|
)
|
300
355
|
end
|
301
356
|
|
302
|
-
CAP_VERSION_KEY = 'cap_version'
|
303
|
-
IDENTIFIER_KEY = 'identifier'
|
304
|
-
SENDER_KEY = 'sender'
|
305
|
-
SENT_KEY = 'sent'
|
306
|
-
STATUS_KEY = 'status'
|
307
|
-
MSG_TYPE_KEY = 'msg_type'
|
308
|
-
SOURCE_KEY = 'source'
|
309
|
-
SCOPE_KEY = 'scope'
|
310
|
-
RESTRICTION_KEY = 'restriction'
|
311
|
-
ADDRESSES_KEY = 'addresses'
|
312
|
-
CODES_KEY = 'codes'
|
313
|
-
NOTE_KEY = 'note'
|
314
|
-
REFERENCES_KEY = 'references'
|
315
|
-
INCIDENTS_KEY = 'incidents'
|
316
|
-
INFOS_KEY = 'infos'
|
357
|
+
CAP_VERSION_KEY = 'cap_version'
|
358
|
+
IDENTIFIER_KEY = 'identifier'
|
359
|
+
SENDER_KEY = 'sender'
|
360
|
+
SENT_KEY = 'sent'
|
361
|
+
STATUS_KEY = 'status'
|
362
|
+
MSG_TYPE_KEY = 'msg_type'
|
363
|
+
SOURCE_KEY = 'source'
|
364
|
+
SCOPE_KEY = 'scope'
|
365
|
+
RESTRICTION_KEY = 'restriction'
|
366
|
+
ADDRESSES_KEY = 'addresses'
|
367
|
+
CODES_KEY = 'codes'
|
368
|
+
NOTE_KEY = 'note'
|
369
|
+
REFERENCES_KEY = 'references'
|
370
|
+
INCIDENTS_KEY = 'incidents'
|
371
|
+
INFOS_KEY = 'infos'
|
317
372
|
|
318
373
|
# Returns a Hash representation of an Alert object
|
374
|
+
#
|
375
|
+
# @return [Hash]
|
319
376
|
def to_h
|
320
377
|
RCAP.attribute_values_to_hash( [ CAP_VERSION_KEY, CAP_VERSION ],
|
321
|
-
[ IDENTIFIER_KEY,
|
322
|
-
[ SENDER_KEY,
|
323
|
-
[ SENT_KEY, RCAP.to_s_for_cap(
|
324
|
-
[ STATUS_KEY,
|
325
|
-
[ MSG_TYPE_KEY,
|
326
|
-
[ SOURCE_KEY,
|
327
|
-
[ SCOPE_KEY,
|
328
|
-
[ RESTRICTION_KEY,
|
329
|
-
[ ADDRESSES_KEY,
|
330
|
-
[ CODES_KEY,
|
331
|
-
[ NOTE_KEY,
|
332
|
-
[ REFERENCES_KEY,
|
333
|
-
[ INCIDENTS_KEY,
|
334
|
-
[ INFOS_KEY,
|
378
|
+
[ IDENTIFIER_KEY, @identifier ],
|
379
|
+
[ SENDER_KEY, @sender ],
|
380
|
+
[ SENT_KEY, RCAP.to_s_for_cap( @sent )],
|
381
|
+
[ STATUS_KEY, @status ],
|
382
|
+
[ MSG_TYPE_KEY, @msg_type ],
|
383
|
+
[ SOURCE_KEY, @source ],
|
384
|
+
[ SCOPE_KEY, @scope ],
|
385
|
+
[ RESTRICTION_KEY, @restriction ],
|
386
|
+
[ ADDRESSES_KEY, @addresses ],
|
387
|
+
[ CODES_KEY, @codes ],
|
388
|
+
[ NOTE_KEY, @note ],
|
389
|
+
[ REFERENCES_KEY, @references ],
|
390
|
+
[ INCIDENTS_KEY, @incidents ],
|
391
|
+
[ INFOS_KEY, @infos.map{ |info| info.to_h }])
|
335
392
|
end
|
336
393
|
|
337
394
|
# Initialises an Alert object from a Hash produced by Alert#to_h
|
395
|
+
#
|
396
|
+
# @param [Hash] alert_hash
|
397
|
+
# @return [Alert]
|
338
398
|
def self.from_h( alert_hash )
|
339
399
|
self.new(
|
340
400
|
:identifier => alert_hash[ IDENTIFIER_KEY ],
|
@@ -354,6 +414,9 @@ module RCAP
|
|
354
414
|
end
|
355
415
|
|
356
416
|
# Returns a JSON string representation of an Alert object
|
417
|
+
#
|
418
|
+
# @param [true,false] pretty_print
|
419
|
+
# @return [String]
|
357
420
|
def to_json( pretty_print = false )
|
358
421
|
if pretty_print
|
359
422
|
JSON.pretty_generate( self.to_h )
|
@@ -362,7 +425,10 @@ module RCAP
|
|
362
425
|
end
|
363
426
|
end
|
364
427
|
|
365
|
-
#
|
428
|
+
# Initialises an Alert object from a JSON string produced by Alert#to_json
|
429
|
+
#
|
430
|
+
# @param [String] json_string
|
431
|
+
# @return [Alert]
|
366
432
|
def self.from_json( json_string )
|
367
433
|
self.from_h( JSON.parse( json_string ))
|
368
434
|
end
|