dor-services 6.0.0 → 6.0.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.
- checksums.yaml +4 -4
- data/lib/dor-services.rb +7 -6
- data/lib/dor/certificate_authenticated_rest_resource_factory.rb +2 -1
- data/lib/dor/config.rb +38 -37
- data/lib/dor/datastreams/administrative_metadata_ds.rb +98 -98
- data/lib/dor/datastreams/content_metadata_ds.rb +26 -17
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +4 -2
- data/lib/dor/datastreams/default_object_rights_ds.rb +10 -7
- data/lib/dor/datastreams/desc_metadata_ds.rb +6 -6
- data/lib/dor/datastreams/embargo_metadata_ds.rb +94 -94
- data/lib/dor/datastreams/events_ds.rb +55 -54
- data/lib/dor/datastreams/geo_metadata_ds.rb +7 -6
- data/lib/dor/datastreams/identity_metadata_ds.rb +128 -125
- data/lib/dor/datastreams/provenance_metadata_ds.rb +3 -1
- data/lib/dor/datastreams/rights_metadata_ds.rb +4 -4
- data/lib/dor/datastreams/role_metadata_ds.rb +42 -42
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -43
- data/lib/dor/datastreams/technical_metadata_ds.rb +3 -1
- data/lib/dor/datastreams/version_metadata_ds.rb +12 -5
- data/lib/dor/datastreams/workflow_definition_ds.rb +74 -73
- data/lib/dor/datastreams/workflow_ds.rb +12 -7
- data/lib/dor/exceptions.rb +2 -0
- data/lib/dor/indexers/data_indexer.rb +16 -0
- data/lib/dor/indexers/describable_indexer.rb +2 -0
- data/lib/dor/indexers/editable_indexer.rb +2 -0
- data/lib/dor/indexers/identifiable_indexer.rb +23 -8
- data/lib/dor/indexers/processable_indexer.rb +2 -0
- data/lib/dor/indexers/releasable_indexer.rb +2 -0
- data/lib/dor/models/abstract.rb +2 -0
- data/lib/dor/models/admin_policy_object.rb +2 -0
- data/lib/dor/models/agreement.rb +2 -0
- data/lib/dor/models/collection.rb +3 -0
- data/lib/dor/models/concerns/assembleable.rb +2 -0
- data/lib/dor/models/concerns/contentable.rb +5 -2
- data/lib/dor/models/concerns/describable.rb +7 -2
- data/lib/dor/models/concerns/editable.rb +28 -21
- data/lib/dor/models/concerns/embargoable.rb +4 -0
- data/lib/dor/models/concerns/eventable.rb +2 -0
- data/lib/dor/models/concerns/geoable.rb +2 -0
- data/lib/dor/models/concerns/governable.rb +7 -2
- data/lib/dor/models/concerns/identifiable.rb +33 -34
- data/lib/dor/models/concerns/itemizable.rb +4 -1
- data/lib/dor/models/concerns/preservable.rb +2 -0
- data/lib/dor/models/concerns/processable.rb +15 -9
- data/lib/dor/models/concerns/publishable.rb +9 -4
- data/lib/dor/models/concerns/releaseable.rb +21 -11
- data/lib/dor/models/concerns/rightsable.rb +2 -0
- data/lib/dor/models/concerns/shelvable.rb +6 -2
- data/lib/dor/models/concerns/versionable.rb +8 -4
- data/lib/dor/models/item.rb +2 -0
- data/lib/dor/models/set.rb +2 -0
- data/lib/dor/models/workflow_object.rb +5 -1
- data/lib/dor/rest_resource_factory.rb +2 -0
- data/lib/dor/services/cleanup_reset_service.rb +2 -1
- data/lib/dor/services/cleanup_service.rb +2 -1
- data/lib/dor/services/digital_stacks_service.rb +3 -1
- data/lib/dor/services/indexing_service.rb +3 -1
- data/lib/dor/services/merge_service.rb +6 -4
- data/lib/dor/services/metadata_handlers/catalog_handler.rb +2 -0
- data/lib/dor/services/metadata_service.rb +4 -4
- data/lib/dor/services/public_desc_metadata_service.rb +16 -8
- data/lib/dor/services/public_xml_service.rb +7 -4
- data/lib/dor/services/registration_service.rb +25 -20
- data/lib/dor/services/reset_workspace_service.rb +4 -4
- data/lib/dor/services/sdr_ingest_service.rb +4 -2
- data/lib/dor/services/search_service.rb +8 -9
- data/lib/dor/services/suri_service.rb +3 -2
- data/lib/dor/services/technical_metadata_service.rb +15 -9
- data/lib/dor/services/thumbnail_service.rb +14 -10
- data/lib/dor/utils/hydrus_shims.rb +2 -0
- data/lib/dor/utils/ng_tidy.rb +3 -7
- data/lib/dor/utils/predicate_patch.rb +2 -0
- data/lib/dor/utils/sdr_client.rb +3 -0
- data/lib/dor/utils/solr_doc_helper.rb +4 -2
- data/lib/dor/version.rb +3 -1
- data/lib/dor/workflow/document.rb +113 -108
- data/lib/dor/workflow/process.rb +90 -87
- data/lib/tasks/rdoc.rake +4 -3
- metadata +4 -4
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DatastreamSpecSolrizer
|
2
4
|
extend ActiveSupport::Concern
|
3
5
|
include SolrDocHelper
|
@@ -5,8 +7,8 @@ module DatastreamSpecSolrizer
|
|
5
7
|
def datastream_spec_string
|
6
8
|
s = begin
|
7
9
|
controlGroup == 'E' ? content.to_s.length : size
|
8
|
-
|
9
|
-
|
10
|
+
rescue
|
11
|
+
0
|
10
12
|
end
|
11
13
|
v = versionID.nil? ? '0' : versionID.to_s.split(/\./).last
|
12
14
|
[dsid, controlGroup, mimeType, v, s, label].join('|')
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'stanford/mods/normalizer'
|
2
4
|
module Dor
|
3
5
|
class DefaultObjectRightsDS < ActiveFedora::OmDatastream
|
@@ -82,6 +84,7 @@ module Dor
|
|
82
84
|
# Ensures that the template is present for the given term
|
83
85
|
def initialize_term!(term)
|
84
86
|
return unless find_by_terms(term).length < 1
|
87
|
+
|
85
88
|
ng_xml_will_change!
|
86
89
|
add_child_node(ng_xml.root, term)
|
87
90
|
end
|
@@ -90,10 +93,10 @@ module Dor
|
|
90
93
|
def update_term!(term, val)
|
91
94
|
ng_xml_will_change!
|
92
95
|
if val.blank?
|
93
|
-
update_values({ [
|
96
|
+
update_values({ [term] => nil })
|
94
97
|
else
|
95
98
|
initialize_term! term
|
96
|
-
update_values({ [
|
99
|
+
update_values({ [term] => val })
|
97
100
|
end
|
98
101
|
normalize!
|
99
102
|
end
|
@@ -124,11 +127,11 @@ module Dor
|
|
124
127
|
# cleanup ordering is important here
|
125
128
|
doc.xpath('//machine/text()').each { |node| node.content = node.content.strip }
|
126
129
|
doc.xpath('//human')
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
130
|
+
.tap { |node_set| norm.clean_linefeeds(node_set) }
|
131
|
+
.each do |node|
|
132
|
+
norm.trim_text(node)
|
133
|
+
norm.remove_empty_nodes(node)
|
134
|
+
end
|
132
135
|
doc.xpath('/rightsMetadata/copyright').each { |node| norm.remove_empty_nodes(node) }
|
133
136
|
doc.xpath('/rightsMetadata/use').each { |node| norm.remove_empty_nodes(node) }
|
134
137
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
class DescMetadataDS < ActiveFedora::OmDatastream
|
3
|
-
|
4
|
-
MODS_NS = 'http://www.loc.gov/mods/v3'.freeze
|
5
|
+
MODS_NS = 'http://www.loc.gov/mods/v3'
|
5
6
|
MODS_HEADER_CONFIG = {
|
6
7
|
'xmlns' => MODS_NS,
|
7
8
|
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
@@ -15,7 +16,7 @@ module Dor
|
|
15
16
|
t.publisher :index_as => [:stored_searchable]
|
16
17
|
t.date_created :path => 'dateCreated', :index_as => [:stored_searchable]
|
17
18
|
t.place :index_as => [:not_searchable] do
|
18
|
-
t.placeTerm :attributes => {:type => 'text'}, :index_as => [:stored_searchable]
|
19
|
+
t.placeTerm :attributes => { :type => 'text' }, :index_as => [:stored_searchable]
|
19
20
|
end
|
20
21
|
end
|
21
22
|
t.subject(:index_as => [:not_searchable]) do
|
@@ -25,11 +26,11 @@ module Dor
|
|
25
26
|
end
|
26
27
|
t.title_info(:path => 'titleInfo') {
|
27
28
|
t.main_title(:index_as => [:symbol], :path => 'title', :label => 'title') {
|
28
|
-
t.main_title_lang(:path => {:attribute => 'xml:lang'})
|
29
|
+
t.main_title_lang(:path => { :attribute => 'xml:lang' })
|
29
30
|
}
|
30
31
|
}
|
31
32
|
t.language {
|
32
|
-
t.languageTerm :attributes => {:type => 'code', :authority => 'iso639-2b'}, :index_as => [:not_searchable]
|
33
|
+
t.languageTerm :attributes => { :type => 'code', :authority => 'iso639-2b' }, :index_as => [:not_searchable]
|
33
34
|
}
|
34
35
|
t.coordinates :index_as => [:symbol]
|
35
36
|
t.extent :index_as => [:symbol]
|
@@ -56,6 +57,5 @@ module Dor
|
|
56
57
|
def prefix
|
57
58
|
''
|
58
59
|
end
|
59
|
-
|
60
60
|
end
|
61
61
|
end
|
@@ -1,114 +1,114 @@
|
|
1
|
-
|
2
|
-
class EmbargoMetadataDS < ActiveFedora::OmDatastream
|
3
|
-
|
4
|
-
before_create :ensure_non_versionable
|
5
|
-
|
6
|
-
set_terminology do |t|
|
7
|
-
t.root(:path => 'embargoMetadata')
|
8
|
-
t.status
|
9
|
-
t.embargo_status(:path => 'status', :index_as => [:symbol])
|
10
|
-
t.release_date(:path => 'releaseDate', :index_as => [:dateable])
|
11
|
-
t.release_access(:path => 'releaseAccess')
|
12
|
-
t.twenty_pct_status(:path => 'twentyPctVisibilityStatus', :index_as => [:symbol])
|
13
|
-
t.twenty_pct_release_date(:path => 'twentyPctVisibilityReleaseDate')
|
14
|
-
end
|
1
|
+
# frozen_string_literal: true
|
15
2
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
3
|
+
module Dor
|
4
|
+
class EmbargoMetadataDS < ActiveFedora::OmDatastream
|
5
|
+
before_create :ensure_non_versionable
|
6
|
+
|
7
|
+
set_terminology do |t|
|
8
|
+
t.root(:path => 'embargoMetadata')
|
9
|
+
t.status
|
10
|
+
t.embargo_status(:path => 'status', :index_as => [:symbol])
|
11
|
+
t.release_date(:path => 'releaseDate', :index_as => [:dateable])
|
12
|
+
t.release_access(:path => 'releaseAccess')
|
13
|
+
t.twenty_pct_status(:path => 'twentyPctVisibilityStatus', :index_as => [:symbol])
|
14
|
+
t.twenty_pct_release_date(:path => 'twentyPctVisibilityReleaseDate')
|
26
15
|
end
|
27
|
-
builder.doc
|
28
|
-
end
|
29
16
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
17
|
+
# Default EmbargoMetadataDS xml
|
18
|
+
def self.xml_template
|
19
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
20
|
+
xml.embargoMetadata {
|
21
|
+
xml.status
|
22
|
+
xml.releaseDate
|
23
|
+
xml.releaseAccess
|
24
|
+
xml.twentyPctVisibilityStatus
|
25
|
+
xml.twentyPctVisibilityReleaseDate
|
26
|
+
}
|
27
|
+
end
|
28
|
+
builder.doc
|
29
|
+
end
|
39
30
|
|
40
|
-
|
41
|
-
|
42
|
-
|
31
|
+
def to_solr(solr_doc = {}, *args)
|
32
|
+
solr_doc = super
|
33
|
+
#::Solrizer.insert_field(solr_doc, field_name, value, *index_types)
|
34
|
+
rd1 = release_date
|
35
|
+
rd20 = twenty_pct_release_date
|
36
|
+
::Solrizer.insert_field(solr_doc, 'embargo_release', rd1.utc.strftime('%FT%TZ'), :dateable) unless rd1.blank?
|
37
|
+
::Solrizer.insert_field(solr_doc, 'twenty_pct_visibility_release', rd20.utc.strftime('%FT%TZ'), :dateable) unless rd20.blank?
|
38
|
+
solr_doc
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
#################################################################################
|
41
|
+
def ensure_non_versionable
|
42
|
+
self.versionable = 'false'
|
43
|
+
end
|
48
44
|
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
#################################################################################
|
46
|
+
# Convenience methods to get and set embargo properties
|
47
|
+
# Hides complexity/verbosity of OM TermOperators for simple, non-repeating values
|
48
|
+
#################################################################################
|
52
49
|
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
def status=(new_status)
|
51
|
+
update_values([:status] => new_status)
|
52
|
+
end
|
56
53
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
update_values([:release_date] => rd.utc.xmlschema)
|
61
|
-
end
|
54
|
+
def status
|
55
|
+
term_values(:status).first
|
56
|
+
end
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
58
|
+
# Sets the release date. Does NOT convert to beginning-of-day.
|
59
|
+
# @param [Time] rd the release date object
|
60
|
+
def release_date=(rd = Time.now.utc)
|
61
|
+
update_values([:release_date] => rd.utc.xmlschema)
|
62
|
+
end
|
69
63
|
|
70
|
-
|
71
|
-
|
72
|
-
|
64
|
+
# Current releaseDate value
|
65
|
+
# @return [Time]
|
66
|
+
def release_date
|
67
|
+
rd = term_values(:release_date).first
|
68
|
+
(rd.nil? || rd.empty?) ? nil : Time.parse(rd)
|
69
|
+
end
|
73
70
|
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
def twenty_pct_status=(new_status)
|
72
|
+
update_values([:twenty_pct_status] => new_status)
|
73
|
+
end
|
77
74
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
update_values([:twenty_pct_release_date] => rd.beginning_of_day.utc.xmlschema)
|
82
|
-
end
|
75
|
+
def twenty_pct_status
|
76
|
+
term_values(:twenty_pct_status).first
|
77
|
+
end
|
83
78
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
79
|
+
# Sets the 20% visibility release date. Converts the date to beginning-of-day, UTC to help with Solr indexing
|
80
|
+
# @param [Time] rd A Time object represeting the release date. By default, it is set to now
|
81
|
+
def twenty_pct_release_date=(rd = Time.now.utc)
|
82
|
+
update_values([:twenty_pct_release_date] => rd.beginning_of_day.utc.xmlschema)
|
83
|
+
end
|
90
84
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
85
|
+
# Current twentyPctVisibilityReleaseDate value
|
86
|
+
# @return [Time]
|
87
|
+
def twenty_pct_release_date
|
88
|
+
rd = term_values(:twenty_pct_release_date).first
|
89
|
+
(rd.nil? || rd.empty?) ? nil : Time.parse(rd)
|
90
|
+
end
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
if new_doc.root.name != 'releaseAccess'
|
100
|
-
raise 'Trying to replace releaseAccess with a non-releaseAccess document'
|
92
|
+
# @return [Nokogiri::XML::Element] The releaseAccess node
|
93
|
+
def release_access_node
|
94
|
+
find_by_terms(:release_access).first
|
101
95
|
end
|
102
96
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
97
|
+
# Sets the embargaAccess node
|
98
|
+
# @param [Nokogiri::XML::Document] new_doc Document that will replace the existing releaseAccess node
|
99
|
+
def release_access_node=(new_doc)
|
100
|
+
if new_doc.root.name != 'releaseAccess'
|
101
|
+
raise 'Trying to replace releaseAccess with a non-releaseAccess document'
|
102
|
+
end
|
107
103
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
104
|
+
term_value_delete(:select => '//embargoMetadata/releaseAccess')
|
105
|
+
ng_xml_will_change!
|
106
|
+
ng_xml.root.add_child(new_doc.root.clone)
|
107
|
+
end
|
112
108
|
|
113
|
-
|
109
|
+
# maintain AF < 8 indexing behavior
|
110
|
+
def prefix
|
111
|
+
''
|
112
|
+
end
|
113
|
+
end
|
114
114
|
end
|
@@ -1,68 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
|
-
class EventsDS < ActiveFedora::OmDatastream
|
3
|
-
|
4
|
+
class EventsDS < ActiveFedora::OmDatastream
|
5
|
+
before_create :ensure_non_versionable
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
set_terminology do |t|
|
8
|
+
t.root(:path => 'events')
|
9
|
+
t.event do
|
10
|
+
t.who :path => { :attribute => 'who' }, :index_as => [:displayable, :not_searchable]
|
11
|
+
t.type_ :path => { :attribute => 'type' }, :index_as => [:displayable, :not_searchable]
|
12
|
+
t.when :path => { :attribute => 'when' }, :index_as => [:displayable, :not_searchable], :data_type => :date
|
13
|
+
t.message :path => 'text()', :index_as => [:displayable, :not_searchable]
|
14
|
+
end
|
12
15
|
end
|
13
|
-
end
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
# Default EventsDS xml
|
18
|
+
def self.xml_template
|
19
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
20
|
+
xml.events
|
21
|
+
end
|
22
|
+
builder.doc
|
19
23
|
end
|
20
|
-
builder.doc
|
21
|
-
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
def ensure_non_versionable
|
26
|
+
self.versionable = 'false'
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
29
|
+
# Adds an event to the datastream
|
30
|
+
# @param [String] type a tag used to group events together. Sets the type attribute for the event
|
31
|
+
# @param [String] who who is responsible for this event. Sets the who attribute for the event
|
32
|
+
# @param [String] message what happened. Sets the content of the event with this message
|
33
|
+
def add_event(type, who, message)
|
34
|
+
ng_xml_will_change!
|
35
|
+
ev = ng_xml.create_element 'event', message,
|
36
|
+
:type => type, :who => who, :when => Time.now.utc.xmlschema
|
37
|
+
ng_xml.root.add_child(ev)
|
38
|
+
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
# Finds events with the desired type attribute
|
41
|
+
# @param [String] tag events where type == tag will be returned
|
42
|
+
# @yield [who, timestamp, message] The values of the current event
|
43
|
+
# @yieldparam [String] who thing responsible for creating the event. Value of the 'who' attribute
|
44
|
+
# @yieldparam [Time] timestamp when this event was logged. Value of the 'when' attribute
|
45
|
+
# @yieldparam [String] message what happened. Content of the event node
|
46
|
+
def find_events_by_type(tag, &block)
|
47
|
+
find_by_terms(:event).xpath("//event[@type='#{tag}']").each do |node|
|
48
|
+
block.call(node['who'], Time.parse(node['when']), node.content)
|
49
|
+
end
|
47
50
|
end
|
48
|
-
end
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
52
|
+
# Returns all the events in the datastream
|
53
|
+
# @yield [type, who, timestamp, message] The values of the current event
|
54
|
+
# @yieldparam [String] type tag for this particular event. Value of the 'type' attribute
|
55
|
+
# @yieldparam [String] who thing responsible for creating the event. Value of the 'who' attribute
|
56
|
+
# @yieldparam [Time] timestamp when this event was logged. Value of the 'when' attribute
|
57
|
+
# @yieldparam [String] message what happened. Content of the event node
|
58
|
+
def each_event(&block)
|
59
|
+
find_by_terms(:event).each do |node|
|
60
|
+
block.call(node['type'], node['who'], Time.parse(node['when']), node.content)
|
61
|
+
end
|
59
62
|
end
|
60
|
-
end
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
# maintain AF < 8 indexing behavior
|
65
|
+
def prefix
|
66
|
+
''
|
67
|
+
end
|
65
68
|
end
|
66
|
-
|
67
|
-
end
|
68
69
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'scanf'
|
4
5
|
require 'uri'
|
@@ -10,7 +11,6 @@ module Dor
|
|
10
11
|
# @see http://www.isotc211.org
|
11
12
|
# @author Darren Hardy
|
12
13
|
class GeoMetadataDS < ActiveFedora::OmDatastream
|
13
|
-
|
14
14
|
# namespaces
|
15
15
|
NS = {
|
16
16
|
:rdf => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
|
@@ -20,10 +20,10 @@ module Dor
|
|
20
20
|
}.freeze
|
21
21
|
|
22
22
|
# hash with all namespaces
|
23
|
-
XMLNS = Hash[NS.map {|k, v| ["xmlns:#{k}", v]}]
|
23
|
+
XMLNS = Hash[NS.map { |k, v| ["xmlns:#{k}", v] }]
|
24
24
|
|
25
25
|
# schema locations
|
26
|
-
NS_XSD = NS.keys.collect {|k| "#{NS[k]} #{NS[k]}/#{k}.xsd"}
|
26
|
+
NS_XSD = NS.keys.collect { |k| "#{NS[k]} #{NS[k]}/#{k}.xsd" }
|
27
27
|
|
28
28
|
# @return [Nokogiri::XML::Document] with gmd:MD_Metadata as root node
|
29
29
|
# @raise [Dor::ParameterError] if MD_Metadata is missing
|
@@ -40,7 +40,8 @@ module Dor
|
|
40
40
|
# or nil if not provided
|
41
41
|
def feature_catalogue
|
42
42
|
root = ng_xml.xpath('/rdf:RDF/rdf:Description/gfc:FC_FeatureCatalogue', XMLNS)
|
43
|
-
return nil if root.nil? || root.empty?
|
43
|
+
return nil if root.nil? || root.empty? # Feature catalog is optional
|
44
|
+
|
44
45
|
Nokogiri::XML(root.first.to_xml)
|
45
46
|
end
|
46
47
|
|
@@ -50,8 +51,8 @@ module Dor
|
|
50
51
|
def self.xml_template
|
51
52
|
Nokogiri::XML::Builder.new do |xml|
|
52
53
|
xml['rdf'].RDF XMLNS,
|
53
|
-
|
54
|
-
|
54
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
55
|
+
'xsi:schemaLocation' => NS_XSD.join(' ') do
|
55
56
|
xml['rdf'].Description 'rdf:about' => nil do
|
56
57
|
xml['gmd'].MD_Metadata
|
57
58
|
end
|