rcap 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|