dor-services 6.0.0 → 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|