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
@@ -8,57 +8,77 @@ module RCAP
|
|
8
8
|
|
9
9
|
validates_presence_of( :name, :value )
|
10
10
|
|
11
|
-
|
11
|
+
# @return [String]
|
12
|
+
attr_accessor( :name )
|
13
|
+
# @return [String]
|
14
|
+
attr_accessor( :value )
|
12
15
|
|
13
|
-
XML_ELEMENT_NAME = "parameter"
|
14
|
-
NAME_ELEMENT_NAME = "valueName"
|
15
|
-
VALUE_ELEMENT_NAME = "value"
|
16
|
+
XML_ELEMENT_NAME = "parameter"
|
17
|
+
NAME_ELEMENT_NAME = "valueName"
|
18
|
+
VALUE_ELEMENT_NAME = "value"
|
16
19
|
|
17
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
18
|
-
NAME_XPATH = "cap:#{ NAME_ELEMENT_NAME }"
|
19
|
-
VALUE_XPATH = "cap:#{ VALUE_ELEMENT_NAME }"
|
20
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
21
|
+
NAME_XPATH = "cap:#{ NAME_ELEMENT_NAME }"
|
22
|
+
VALUE_XPATH = "cap:#{ VALUE_ELEMENT_NAME }"
|
20
23
|
|
24
|
+
# @param [Hash] attributes
|
25
|
+
# @option attributes [Symbol] :name Parameter name
|
26
|
+
# @option attributes [Symbol] :value Parameter value
|
21
27
|
def initialize( attributes = {} )
|
22
28
|
@name = attributes[ :name ]
|
23
29
|
@value = attributes[ :value ]
|
24
30
|
end
|
25
31
|
|
26
|
-
|
32
|
+
# @return [REXML::Element]
|
33
|
+
def to_xml_element
|
27
34
|
xml_element = REXML::Element.new( self.class::XML_ELEMENT_NAME )
|
28
|
-
xml_element.add_element( NAME_ELEMENT_NAME ).add_text(
|
29
|
-
xml_element.add_element( VALUE_ELEMENT_NAME ).add_text(
|
35
|
+
xml_element.add_element( self.class::NAME_ELEMENT_NAME ).add_text( @name )
|
36
|
+
xml_element.add_element( self.class::VALUE_ELEMENT_NAME ).add_text( @value )
|
30
37
|
xml_element
|
31
38
|
end
|
32
39
|
|
33
|
-
|
40
|
+
# @return [String]
|
41
|
+
def to_xml
|
34
42
|
self.to_xml_element.to_s
|
35
43
|
end
|
36
44
|
|
37
|
-
|
38
|
-
|
45
|
+
# @return [String]
|
46
|
+
def inspect
|
47
|
+
"#{ @name }: #{ @value }"
|
39
48
|
end
|
40
49
|
|
41
50
|
# Returns a string representation of the parameter of the form
|
42
51
|
# name: value
|
52
|
+
#
|
53
|
+
# @return [String]
|
43
54
|
def to_s
|
44
55
|
self.inspect
|
45
56
|
end
|
46
57
|
|
58
|
+
# @param [REXML::Element] parameter_xml_element
|
59
|
+
# @return [Parameter]
|
47
60
|
def self.from_xml_element( parameter_xml_element ) # :nodoc:
|
48
|
-
self.new( :name => RCAP.xpath_text( parameter_xml_element, NAME_XPATH, Alert::XMLNS ),
|
49
|
-
|
61
|
+
self.new( :name => RCAP.xpath_text( parameter_xml_element, self::NAME_XPATH, Alert::XMLNS ),
|
62
|
+
:value => RCAP.xpath_text( parameter_xml_element, self::VALUE_XPATH, Alert::XMLNS ))
|
50
63
|
end
|
51
64
|
|
52
65
|
# Two parameters are equivalent if they have the same name and value.
|
66
|
+
#
|
67
|
+
# @param [Parameter] other
|
68
|
+
# @return [true, false]
|
53
69
|
def ==( other )
|
54
|
-
[
|
70
|
+
[ @name, @value ] == [ other.name, other.value ]
|
55
71
|
end
|
56
72
|
|
57
|
-
|
58
|
-
|
73
|
+
# @return [Hash]
|
74
|
+
def to_h
|
75
|
+
RCAP.attribute_values_to_hash(
|
76
|
+
[ @name, @value ])
|
59
77
|
end
|
60
78
|
|
61
|
-
|
79
|
+
# @param [Hash] hash
|
80
|
+
# @return [Parameter]
|
81
|
+
def self.from_h( hash )
|
62
82
|
key = hash.keys.first
|
63
83
|
self.new( :name => key, :value => hash[ key ])
|
64
84
|
end
|
data/lib/rcap/cap_1_2/point.rb
CHANGED
@@ -11,13 +11,18 @@ module RCAP
|
|
11
11
|
MAX_LATTITUDE = 90
|
12
12
|
MIN_LATTITUDE= -90
|
13
13
|
|
14
|
+
# @return [Numeric]
|
14
15
|
attr_accessor( :lattitude )
|
16
|
+
# @return [Numeric]
|
15
17
|
attr_accessor( :longitude )
|
16
18
|
|
17
19
|
validates_numericality_of( :lattitude, :longitude )
|
18
20
|
validates_inclusion_of( :lattitude, :in => MIN_LATTITUDE..MAX_LATTITUDE )
|
19
21
|
validates_inclusion_of( :longitude, :in => MIN_LONGITUDE..MAX_LONGITUDE)
|
20
22
|
|
23
|
+
# @param [Hash] attributes
|
24
|
+
# @option attributes [Numeric] :lattitude
|
25
|
+
# @option attributes [Numeric] :longitude
|
21
26
|
def initialize( attributes = {} )
|
22
27
|
@lattitude = attributes[ :lattitude ]
|
23
28
|
@longitude = attributes[ :longitude ]
|
@@ -25,29 +30,38 @@ module RCAP
|
|
25
30
|
|
26
31
|
# Returns a string representation of the point of the form
|
27
32
|
# lattitude,longitude
|
33
|
+
#
|
34
|
+
# @return [String]
|
28
35
|
def to_s
|
29
|
-
"#{
|
36
|
+
"#{ @lattitude },#{ @longitude }"
|
30
37
|
end
|
31
38
|
|
32
|
-
|
39
|
+
# @return [String]
|
40
|
+
def inspect
|
33
41
|
'('+self.to_s+')'
|
34
42
|
end
|
35
43
|
|
36
44
|
# Two points are equivalent if they have the same lattitude and longitude
|
45
|
+
#
|
46
|
+
# @param [Point] other
|
47
|
+
# @return [true, false]
|
37
48
|
def ==( other )
|
38
|
-
[
|
49
|
+
[ @lattitude, @longitude ] == [ other.lattitude, other.longitude ]
|
39
50
|
end
|
40
51
|
|
41
|
-
LATTITUDE_KEY = 'lattitude'
|
42
|
-
LONGITUDE_KEY = 'longitude'
|
52
|
+
LATTITUDE_KEY = 'lattitude'
|
53
|
+
LONGITUDE_KEY = 'longitude'
|
43
54
|
|
44
|
-
|
55
|
+
# @return [Hash]
|
56
|
+
def to_h
|
45
57
|
RCAP.attribute_values_to_hash(
|
46
|
-
[ LATTITUDE_KEY,
|
47
|
-
[ LONGITUDE_KEY,
|
58
|
+
[ LATTITUDE_KEY, @lattitude ],
|
59
|
+
[ LONGITUDE_KEY, @longitude ])
|
48
60
|
end
|
49
61
|
|
50
|
-
|
62
|
+
# @param [Hash] point_hash
|
63
|
+
# @return [Point]
|
64
|
+
def self.from_h( point_hash )
|
51
65
|
self.new( :lattitude => point_hash[ LATTITUDE_KEY ], :longitude => point_hash[ LONGITUDE_KEY ])
|
52
66
|
end
|
53
67
|
end
|
data/lib/rcap/cap_1_2/polygon.rb
CHANGED
@@ -6,25 +6,28 @@ module RCAP
|
|
6
6
|
class Polygon
|
7
7
|
include Validation
|
8
8
|
|
9
|
-
# Collection of Point objects.
|
9
|
+
# @return [Array<Point>] Collection of {Point} objects.
|
10
10
|
attr_reader( :points )
|
11
11
|
|
12
12
|
validates_collection_of( :points )
|
13
13
|
validates_length_of( :points, :minimum => 4 )
|
14
14
|
validates_equality_of_first_and_last( :points )
|
15
15
|
|
16
|
-
XML_ELEMENT_NAME = 'polygon'
|
17
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
18
|
-
|
16
|
+
XML_ELEMENT_NAME = 'polygon'
|
17
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
18
|
+
|
19
|
+
# @param [Hash] attributes
|
20
|
+
# @option attributes [Array<Point>] :points Collection of {Point} objects
|
19
21
|
def initialize( attributes = {})
|
20
22
|
@points = Array( attributes[ :points ])
|
21
23
|
end
|
22
24
|
|
23
|
-
# Creates a new Point object and adds it to the points array.
|
24
|
-
#
|
25
|
+
# Creates a new Point object and adds it to the points array.
|
26
|
+
#
|
27
|
+
# @see Point#initialize
|
25
28
|
def add_point( point_attributes = {})
|
26
29
|
point = Point.new( point_attributes )
|
27
|
-
|
30
|
+
@points << point
|
28
31
|
point
|
29
32
|
end
|
30
33
|
|
@@ -35,26 +38,37 @@ module RCAP
|
|
35
38
|
@points.join( ' ' )
|
36
39
|
end
|
37
40
|
|
38
|
-
|
41
|
+
# @return [String]
|
42
|
+
def inspect
|
39
43
|
"(#{ @points.map{|point| point.inspect}.join(', ')})"
|
40
44
|
end
|
41
45
|
|
42
|
-
|
46
|
+
# @return [REXML::Element]
|
47
|
+
def to_xml_element
|
43
48
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
44
49
|
xml_element.add_text( self.to_s )
|
45
50
|
xml_element
|
46
51
|
end
|
47
52
|
|
53
|
+
# @return [String]
|
54
|
+
def to_xml
|
55
|
+
self.to_xml_element.to_s
|
56
|
+
end
|
57
|
+
|
48
58
|
# Two polygons are equivalent if their collection of points is equivalent.
|
59
|
+
#
|
60
|
+
# @return [true,false]
|
49
61
|
def ==( other )
|
50
|
-
|
62
|
+
@points == other.points
|
51
63
|
end
|
52
64
|
|
53
|
-
|
65
|
+
# @return [Array<Array(Numeric,Numeric)>]
|
66
|
+
def self.parse_polygon_string( polygon_string )
|
54
67
|
polygon_string.split( ' ' ).map{ |coordinate_string| coordinate_string.split( ',' ).map{|coordinate| coordinate.to_f }}
|
55
68
|
end
|
56
69
|
|
57
|
-
|
70
|
+
# @return [Polygon]
|
71
|
+
def self.from_xml_element( polygon_xml_element )
|
58
72
|
if polygon_xml_element.text && !polygon_xml_element.text.empty?
|
59
73
|
coordinates = self.parse_polygon_string( polygon_xml_element.text )
|
60
74
|
points = coordinates.map{ |lattitude, longitude| Point.new( :lattitude => lattitude, :longitude => longitude )}
|
@@ -64,22 +78,25 @@ module RCAP
|
|
64
78
|
end
|
65
79
|
end
|
66
80
|
|
67
|
-
|
68
|
-
def to_yaml( options = {} )
|
69
|
-
|
81
|
+
# @return [String]
|
82
|
+
def to_yaml( options = {} )
|
83
|
+
@points.map{ |point| [ point.lattitude, point.longitude ]}.to_yaml( options )
|
70
84
|
end
|
71
85
|
|
72
|
-
|
86
|
+
# @return [Polygon]
|
87
|
+
def self.from_yaml_data( polygon_yaml_data )
|
73
88
|
self.new( :points => Array( polygon_yaml_data ).map{ |lattitude, longitude| Point.new( :lattitude => lattitude, :longitude => longitude )})
|
74
89
|
end
|
75
90
|
|
76
|
-
POINTS_KEY = 'points'
|
91
|
+
POINTS_KEY = 'points'
|
77
92
|
|
78
|
-
|
79
|
-
|
93
|
+
# @return [Hash]
|
94
|
+
def to_h
|
95
|
+
{ POINTS_KEY => @points.map{ |point| point.to_h }}
|
80
96
|
end
|
81
97
|
|
82
|
-
|
98
|
+
# @return [Polygon]
|
99
|
+
def self.from_h( polygon_hash )
|
83
100
|
self.new( :points => polygon_hash[ POINTS_KEY ].map{ |point_hash| Point.from_h( point_hash )})
|
84
101
|
end
|
85
102
|
end
|
@@ -3,41 +3,49 @@ module RCAP
|
|
3
3
|
|
4
4
|
# A Resource object is valid if
|
5
5
|
# * it has a resource description
|
6
|
+
# * it has a mime_type
|
6
7
|
class Resource
|
7
8
|
include Validation
|
8
9
|
|
9
|
-
# Resource
|
10
|
+
# @return [String] Resource description
|
10
11
|
attr_accessor( :resource_desc )
|
11
|
-
# MIME type as described in RFC 2046
|
12
|
+
# @return [String] MIME type as described in RFC 2046
|
12
13
|
attr_accessor( :mime_type )
|
13
|
-
# Expressed in bytes
|
14
|
+
# @return [Integer] Expressed in bytes
|
14
15
|
attr_accessor( :size )
|
15
|
-
# Resource location
|
16
|
+
# @return [String] Resource location
|
16
17
|
attr_accessor( :uri )
|
17
|
-
# Dereferenced URI - contents of URI Base64 encoded
|
18
|
+
# @return [String] Dereferenced URI - contents of URI Base64 encoded
|
18
19
|
attr_accessor( :deref_uri )
|
19
|
-
# SHA-1 hash of contents of resource
|
20
|
+
# @return [String] SHA-1 hash of contents of resource
|
20
21
|
attr_accessor( :digest )
|
21
22
|
|
22
23
|
validates_presence_of( :resource_desc )
|
23
24
|
validates_presence_of( :mime_type )
|
24
25
|
|
25
|
-
XML_ELEMENT_NAME = 'resource'
|
26
|
-
MIME_TYPE_ELEMENT_NAME = 'mimeType'
|
27
|
-
SIZE_ELEMENT_NAME = 'size'
|
28
|
-
URI_ELEMENT_NAME = 'uri'
|
29
|
-
DEREF_URI_ELEMENT_NAME = 'derefUri'
|
30
|
-
DIGEST_ELEMENT_NAME = 'digest'
|
31
|
-
RESOURCE_DESC_ELEMENT_NAME = 'resourceDesc'
|
32
|
-
|
33
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
34
|
-
MIME_TYPE_XPATH = "cap:#{ MIME_TYPE_ELEMENT_NAME }"
|
35
|
-
SIZE_XPATH = "cap:#{ SIZE_ELEMENT_NAME }"
|
36
|
-
URI_XPATH = "cap:#{ URI_ELEMENT_NAME }"
|
37
|
-
DEREF_URI_XPATH = "cap:#{ DEREF_URI_ELEMENT_NAME }"
|
38
|
-
DIGEST_XPATH = "cap:#{ DIGEST_ELEMENT_NAME }"
|
39
|
-
RESOURCE_DESC_XPATH = "cap:#{ RESOURCE_DESC_ELEMENT_NAME }"
|
40
|
-
|
26
|
+
XML_ELEMENT_NAME = 'resource'
|
27
|
+
MIME_TYPE_ELEMENT_NAME = 'mimeType'
|
28
|
+
SIZE_ELEMENT_NAME = 'size'
|
29
|
+
URI_ELEMENT_NAME = 'uri'
|
30
|
+
DEREF_URI_ELEMENT_NAME = 'derefUri'
|
31
|
+
DIGEST_ELEMENT_NAME = 'digest'
|
32
|
+
RESOURCE_DESC_ELEMENT_NAME = 'resourceDesc'
|
33
|
+
|
34
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
35
|
+
MIME_TYPE_XPATH = "cap:#{ MIME_TYPE_ELEMENT_NAME }"
|
36
|
+
SIZE_XPATH = "cap:#{ SIZE_ELEMENT_NAME }"
|
37
|
+
URI_XPATH = "cap:#{ URI_ELEMENT_NAME }"
|
38
|
+
DEREF_URI_XPATH = "cap:#{ DEREF_URI_ELEMENT_NAME }"
|
39
|
+
DIGEST_XPATH = "cap:#{ DIGEST_ELEMENT_NAME }"
|
40
|
+
RESOURCE_DESC_XPATH = "cap:#{ RESOURCE_DESC_ELEMENT_NAME }"
|
41
|
+
|
42
|
+
# @param [Hash{Symbol => Object}] attributes
|
43
|
+
# @option attributes [String] :mime_type
|
44
|
+
# @option attributes [Numeric] :size Size in bytes
|
45
|
+
# @option attributes [String] :uri
|
46
|
+
# @option attributes [String] :deref_uri
|
47
|
+
# @option attributes [String] :digest
|
48
|
+
# @option attributes [String] :resource_desc
|
41
49
|
def initialize( attributes = {} )
|
42
50
|
@mime_type = attributes[ :mime_type ]
|
43
51
|
@size = attributes[ :size ]
|
@@ -47,57 +55,83 @@ module RCAP
|
|
47
55
|
@resource_desc = attributes[ :resource_desc ]
|
48
56
|
end
|
49
57
|
|
50
|
-
|
58
|
+
# @return [REXML::Element]
|
59
|
+
def to_xml_element
|
51
60
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
52
|
-
xml_element.add_element( RESOURCE_DESC_ELEMENT_NAME ).add_text(
|
53
|
-
xml_element.add_element( MIME_TYPE_ELEMENT_NAME ).add_text(
|
54
|
-
xml_element.add_element( SIZE_ELEMENT_NAME ).add_text(
|
55
|
-
xml_element.add_element( URI_ELEMENT_NAME ).add_text(
|
56
|
-
xml_element.add_element( DEREF_URI_ELEMENT_NAME ).add_text(
|
57
|
-
xml_element.add_element( DIGEST_ELEMENT_NAME ).add_text(
|
61
|
+
xml_element.add_element( RESOURCE_DESC_ELEMENT_NAME ).add_text( @resource_desc )
|
62
|
+
xml_element.add_element( MIME_TYPE_ELEMENT_NAME ).add_text( @mime_type ) if @mime_type
|
63
|
+
xml_element.add_element( SIZE_ELEMENT_NAME ).add_text( @size.to_s ) if @size
|
64
|
+
xml_element.add_element( URI_ELEMENT_NAME ).add_text( @uri ) if @uri
|
65
|
+
xml_element.add_element( DEREF_URI_ELEMENT_NAME ).add_text( @deref_uri ) if @deref_uri
|
66
|
+
xml_element.add_element( DIGEST_ELEMENT_NAME ).add_text( @digest ) if @digest
|
58
67
|
xml_element
|
59
68
|
end
|
60
69
|
|
61
70
|
# If size is defined returns the size in kilobytes
|
71
|
+
# @return [Float]
|
62
72
|
def size_in_kb
|
63
|
-
if
|
64
|
-
|
73
|
+
if @size
|
74
|
+
@size.to_f/1024
|
65
75
|
end
|
66
76
|
end
|
67
77
|
|
68
|
-
|
78
|
+
# @return [String]
|
79
|
+
def to_xml
|
69
80
|
self.to_xml_element.to_s
|
70
81
|
end
|
71
82
|
|
72
|
-
|
73
|
-
|
83
|
+
# @return [String]
|
84
|
+
def inspect
|
85
|
+
[ @resource_desc, @uri, @mime_type, @size ? format( "%.1fKB", @size_in_kb ) : nil ].compact.join(' - ')
|
74
86
|
end
|
75
87
|
|
76
88
|
# Returns a string representation of the resource of the form
|
77
89
|
# resource_desc
|
90
|
+
#
|
91
|
+
# @return [String]
|
78
92
|
def to_s
|
79
|
-
|
93
|
+
@resource_desc
|
80
94
|
end
|
81
95
|
|
82
96
|
# Retrieves the content at uri and stores it in deref_uri as Base64 encoded text. It will also
|
83
|
-
# calculate the digest on the encoded data using SHA1 and set the size.
|
97
|
+
# calculate the {#digest} on the encoded data using SHA1 and set the {#size}.
|
84
98
|
#
|
85
99
|
# This uses the open-uri[http://ruby-doc.org/stdlib/libdoc/open-uri/rdoc/index.html] Ruby API
|
86
|
-
# to open and read the content.
|
100
|
+
# to open and read the content. This method may throw an exception due to any number of network
|
101
|
+
# related issue so please handle accordingly.
|
102
|
+
#
|
103
|
+
# Returns an array containing the size (in bytes) and SHA-1 hash.
|
104
|
+
#
|
105
|
+
# @return [Array(Integer,String)]
|
87
106
|
def dereference_uri!
|
88
107
|
content = URI.parse( self.uri ).read
|
89
108
|
@deref_uri = Base64.encode64( content )
|
90
109
|
self.calculate_hash_and_size
|
91
110
|
end
|
92
111
|
|
112
|
+
# Calculates the SHA-1 hash and size of the contents of {#deref_uri}.
|
113
|
+
# Returns an array containing the size (in bytes) and SHA-1 hash if
|
114
|
+
# {#deref_uri} is present otherwise returns nil.
|
115
|
+
#
|
116
|
+
# @return [nil,Array(Integer,String)]
|
93
117
|
def calculate_hash_and_size
|
94
118
|
if @deref_uri
|
95
119
|
@digest = Digest::SHA1.hexdigest( @deref_uri )
|
96
120
|
@size = @deref_uri.bytesize
|
121
|
+
[ @size, @digest ]
|
97
122
|
end
|
98
123
|
end
|
99
124
|
|
100
|
-
|
125
|
+
# The decoded contents of {#deref_uri} if present otherwise nil.
|
126
|
+
#
|
127
|
+
# @return [nil,String]
|
128
|
+
def decoded_deref_uri
|
129
|
+
Base64.decode64( @deref_uri ) if @deref_uri
|
130
|
+
end
|
131
|
+
|
132
|
+
# @param [REXML::Element] resource_xml_element
|
133
|
+
# @return [Resource]
|
134
|
+
def self.from_xml_element( resource_xml_element )
|
101
135
|
resource = self.new( :resource_desc => RCAP.xpath_text( resource_xml_element, RESOURCE_DESC_XPATH, Alert::XMLNS ),
|
102
136
|
:uri => RCAP.xpath_text( resource_xml_element, URI_XPATH, Alert::XMLNS ),
|
103
137
|
:mime_type => RCAP.xpath_text( resource_xml_element, MIME_TYPE_XPATH, Alert::XMLNS ),
|
@@ -106,25 +140,28 @@ module RCAP
|
|
106
140
|
:digest => RCAP.xpath_text( resource_xml_element, DIGEST_XPATH, Alert::XMLNS ))
|
107
141
|
end
|
108
142
|
|
109
|
-
RESOURCE_DESC_YAML = "Resource Description"
|
110
|
-
URI_YAML = "URI"
|
111
|
-
MIME_TYPE_YAML = "Mime Type"
|
112
|
-
DEREF_URI_YAML = "Derefrenced URI Data"
|
113
|
-
SIZE_YAML = "Size"
|
114
|
-
DIGEST_YAML = "Digest"
|
143
|
+
RESOURCE_DESC_YAML = "Resource Description"
|
144
|
+
URI_YAML = "URI"
|
145
|
+
MIME_TYPE_YAML = "Mime Type"
|
146
|
+
DEREF_URI_YAML = "Derefrenced URI Data"
|
147
|
+
SIZE_YAML = "Size"
|
148
|
+
DIGEST_YAML = "Digest"
|
115
149
|
|
116
|
-
|
150
|
+
# @param [Hash] options
|
151
|
+
# @return [String]
|
152
|
+
def to_yaml( options = {} )
|
117
153
|
RCAP.attribute_values_to_hash(
|
118
|
-
[ RESOURCE_DESC_YAML,
|
119
|
-
[ URI_YAML,
|
120
|
-
[ MIME_TYPE_YAML,
|
121
|
-
[ DEREF_URI_YAML,
|
122
|
-
[ SIZE_YAML,
|
123
|
-
[ DIGEST_YAML,
|
124
|
-
).to_yaml( options )
|
154
|
+
[ RESOURCE_DESC_YAML, @resource_desc ],
|
155
|
+
[ URI_YAML, @uri ],
|
156
|
+
[ MIME_TYPE_YAML, @mime_type ],
|
157
|
+
[ DEREF_URI_YAML, @deref_uri ],
|
158
|
+
[ SIZE_YAML, @size ],
|
159
|
+
[ DIGEST_YAML, @digest ]).to_yaml( options )
|
125
160
|
end
|
126
161
|
|
127
|
-
|
162
|
+
# @param [Hash] resource_yaml_data
|
163
|
+
# @return [Resource]
|
164
|
+
def self.from_yaml_data( resource_yaml_data )
|
128
165
|
self.new(
|
129
166
|
:resource_desc => reource_yaml_data[ RESOURCE_DESC_YAML ],
|
130
167
|
:uri => reource_yaml_data[ URI_YAML ],
|
@@ -135,24 +172,27 @@ module RCAP
|
|
135
172
|
)
|
136
173
|
end
|
137
174
|
|
138
|
-
RESOURCE_DESC_KEY = 'resource_desc'
|
139
|
-
URI_KEY = 'uri'
|
140
|
-
MIME_TYPE_KEY = 'mime_type'
|
141
|
-
DEREF_URI_KEY = 'deref_uri'
|
142
|
-
SIZE_KEY = 'size'
|
143
|
-
DIGEST_KEY = 'digest'
|
175
|
+
RESOURCE_DESC_KEY = 'resource_desc'
|
176
|
+
URI_KEY = 'uri'
|
177
|
+
MIME_TYPE_KEY = 'mime_type'
|
178
|
+
DEREF_URI_KEY = 'deref_uri'
|
179
|
+
SIZE_KEY = 'size'
|
180
|
+
DIGEST_KEY = 'digest'
|
144
181
|
|
145
|
-
|
182
|
+
# @return [Hash]
|
183
|
+
def to_h
|
146
184
|
RCAP.attribute_values_to_hash(
|
147
|
-
[ RESOURCE_DESC_KEY,
|
148
|
-
[ URI_KEY,
|
149
|
-
[ MIME_TYPE_KEY,
|
150
|
-
[ DEREF_URI_KEY,
|
151
|
-
[ SIZE_KEY,
|
152
|
-
[ DIGEST_KEY,
|
185
|
+
[ RESOURCE_DESC_KEY, @resource_desc ],
|
186
|
+
[ URI_KEY, @uri],
|
187
|
+
[ MIME_TYPE_KEY, @mime_type],
|
188
|
+
[ DEREF_URI_KEY, @deref_uri],
|
189
|
+
[ SIZE_KEY, @size ],
|
190
|
+
[ DIGEST_KEY, @digest ])
|
153
191
|
end
|
154
192
|
|
155
|
-
|
193
|
+
# @param [Hash] resource_hash
|
194
|
+
# @return [Resource]
|
195
|
+
def self.from_h( resource_hash )
|
156
196
|
self.new(
|
157
197
|
:resource_desc => resource_hash[ RESOURCE_DESC_KEY ],
|
158
198
|
:uri => resource_hash[ URI_KEY ],
|