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,139 +1,142 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
|
-
class IdentityMetadataDS < ActiveFedora::OmDatastream
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
class IdentityMetadataDS < ActiveFedora::OmDatastream
|
5
|
+
include SolrDocHelper
|
6
|
+
|
7
|
+
set_terminology do |t|
|
8
|
+
t.root(:path => 'identityMetadata')
|
9
|
+
t.objectId :index_as => [:symbol]
|
10
|
+
t.objectType :index_as => [:symbol]
|
11
|
+
t.objectLabel
|
12
|
+
t.citationCreator
|
13
|
+
t.sourceId
|
14
|
+
t.otherId(:path => 'otherId') do
|
15
|
+
t.name_(:path => { :attribute => 'name' })
|
16
|
+
end
|
17
|
+
t.agreementId :index_as => [:stored_searchable, :symbol]
|
18
|
+
t.tag :index_as => [:symbol]
|
19
|
+
t.citationTitle
|
20
|
+
t.objectCreator :index_as => [:stored_searchable, :symbol]
|
21
|
+
t.adminPolicy :index_as => [:not_searchable]
|
22
|
+
end
|
23
|
+
|
24
|
+
define_template :value do |builder, name, value, attrs|
|
25
|
+
builder.send(name.to_sym, value, attrs)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.xml_template
|
29
|
+
Nokogiri::XML('<identityMetadata/>')
|
14
30
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
t.adminPolicy :index_as => [:not_searchable]
|
20
|
-
end
|
21
|
-
|
22
|
-
define_template :value do |builder, name, value, attrs|
|
23
|
-
builder.send(name.to_sym, value, attrs)
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.xml_template
|
27
|
-
Nokogiri::XML('<identityMetadata/>')
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_value(name, value, attrs = {})
|
31
|
-
ng_xml_will_change!
|
32
|
-
add_child_node(ng_xml.root, :value, name, value, attrs)
|
33
|
-
end
|
34
|
-
|
35
|
-
def objectId
|
36
|
-
find_by_terms(:objectId).text
|
37
|
-
end
|
38
|
-
|
39
|
-
def sourceId
|
40
|
-
node = find_by_terms(:sourceId).first
|
41
|
-
node ? [node['source'], node.text].join(':') : nil
|
42
|
-
end
|
43
|
-
|
44
|
-
# @param [String, Nil] value, or nil/empty string to delete sourceId node
|
45
|
-
# @return [String, Nil] The same value, as per Ruby convention for assignment operators
|
46
|
-
# @note The actual values assigned will have leading/trailing whitespace stripped.
|
47
|
-
def sourceId=(value)
|
48
|
-
ng_xml_will_change!
|
49
|
-
node = find_by_terms(:sourceId).first
|
50
|
-
unless value.present? # so setting it to '' is the same as removal: worth documenting maybe?
|
51
|
-
node.remove unless node.nil?
|
52
|
-
return nil
|
31
|
+
|
32
|
+
def add_value(name, value, attrs = {})
|
33
|
+
ng_xml_will_change!
|
34
|
+
add_child_node(ng_xml.root, :value, name, value, attrs)
|
53
35
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def tags
|
63
|
-
ng_xml.search('//tag').collect(&:content)
|
64
|
-
end
|
65
|
-
|
66
|
-
def otherId(type = nil)
|
67
|
-
result = find_by_terms(:otherId).to_a
|
68
|
-
if type.nil?
|
69
|
-
result.collect { |n| [n['name'], n.text].join(':') }
|
70
|
-
else
|
71
|
-
result.select { |n| n['name'] == type }.collect { |n| n.text }
|
36
|
+
|
37
|
+
def objectId
|
38
|
+
find_by_terms(:objectId).text
|
39
|
+
end
|
40
|
+
|
41
|
+
def sourceId
|
42
|
+
node = find_by_terms(:sourceId).first
|
43
|
+
node ? [node['source'], node.text].join(':') : nil
|
72
44
|
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
def to_solr(solr_doc = {}, *args)
|
85
|
-
solr_doc = super(solr_doc, *args)
|
86
|
-
|
87
|
-
if digital_object.respond_to?(:profile)
|
88
|
-
digital_object.profile.each_pair do |property, value|
|
89
|
-
add_solr_value(solr_doc, property.underscore, value, (property =~ /Date/ ? :date : :symbol), [:stored_searchable])
|
45
|
+
|
46
|
+
# @param [String, Nil] value, or nil/empty string to delete sourceId node
|
47
|
+
# @return [String, Nil] The same value, as per Ruby convention for assignment operators
|
48
|
+
# @note The actual values assigned will have leading/trailing whitespace stripped.
|
49
|
+
def sourceId=(value)
|
50
|
+
ng_xml_will_change!
|
51
|
+
node = find_by_terms(:sourceId).first
|
52
|
+
unless value.present? # so setting it to '' is the same as removal: worth documenting maybe?
|
53
|
+
node&.remove
|
54
|
+
return nil
|
90
55
|
end
|
56
|
+
parts = value.split(':', 2).map(&:strip)
|
57
|
+
raise ArgumentError, "Source ID must follow the format 'namespace:value', not '#{value}'" unless
|
58
|
+
parts.length == 2 && parts[0].present? && parts[1].present?
|
59
|
+
|
60
|
+
node ||= ng_xml.root.add_child('<sourceId/>').first
|
61
|
+
node['source'] = parts[0]
|
62
|
+
node.content = parts[1]
|
91
63
|
end
|
92
64
|
|
93
|
-
|
94
|
-
(
|
95
|
-
add_solr_value(solr_doc, 'dor_id', id, :symbol, [:stored_searchable])
|
96
|
-
add_solr_value(solr_doc, 'identifier', sourceId, :symbol, [:stored_searchable])
|
97
|
-
add_solr_value(solr_doc, 'source_id', sourceId, :symbol, [])
|
65
|
+
def tags
|
66
|
+
ng_xml.search('//tag').collect(&:content)
|
98
67
|
end
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
# do some stuff to make tags in general and project tags specifically more easily searchable and facetable
|
108
|
-
find_by_terms(:tag).each { |tag|
|
109
|
-
(prefix, rest) = tag.text.split(/:/, 2)
|
110
|
-
prefix = prefix.downcase.strip.gsub(/\s/, '_')
|
111
|
-
unless rest.nil?
|
112
|
-
# this part will index a value in a field specific to the tag, e.g. registered_by_tag_*,
|
113
|
-
# book_tag_*, project_tag_*, remediated_by_tag_*, etc. project_tag_* and registered_by_tag_*
|
114
|
-
# definitley get used, but most don't. we can limit the prefixes that get solrized if things
|
115
|
-
# get out of hand.
|
116
|
-
add_solr_value(solr_doc, "#{prefix}_tag", rest.strip, :symbol, [])
|
68
|
+
|
69
|
+
def otherId(type = nil)
|
70
|
+
result = find_by_terms(:otherId).to_a
|
71
|
+
if type.nil?
|
72
|
+
result.collect { |n| [n['name'], n.text].join(':') }
|
73
|
+
else
|
74
|
+
result.select { |n| n['name'] == type }.collect { |n| n.text }
|
117
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_otherId(other_id)
|
79
|
+
ng_xml_will_change!
|
80
|
+
(name, val) = other_id.split(/:/, 2)
|
81
|
+
node = ng_xml.root.add_child('<otherId/>').first
|
82
|
+
node['name'] = name
|
83
|
+
node.content = val
|
84
|
+
node
|
85
|
+
end
|
86
|
+
|
87
|
+
def to_solr(solr_doc = {}, *args)
|
88
|
+
solr_doc = super(solr_doc, *args)
|
118
89
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
progressive_tag_prefix = ''
|
124
|
-
tag_parts.each_with_index do |part, index|
|
125
|
-
progressive_tag_prefix += ' : ' if index > 0
|
126
|
-
progressive_tag_prefix += part.strip
|
127
|
-
add_solr_value(solr_doc, 'exploded_tag', progressive_tag_prefix, :symbol, [])
|
90
|
+
if digital_object.respond_to?(:profile)
|
91
|
+
digital_object.profile.each_pair do |property, value|
|
92
|
+
add_solr_value(solr_doc, property.underscore, value, (property =~ /Date/ ? :date : :symbol), [:stored_searchable])
|
93
|
+
end
|
128
94
|
end
|
129
|
-
}
|
130
95
|
|
131
|
-
|
132
|
-
|
96
|
+
if sourceId.present?
|
97
|
+
(name, id) = sourceId.split(/:/, 2)
|
98
|
+
add_solr_value(solr_doc, 'dor_id', id, :symbol, [:stored_searchable])
|
99
|
+
add_solr_value(solr_doc, 'identifier', sourceId, :symbol, [:stored_searchable])
|
100
|
+
add_solr_value(solr_doc, 'source_id', sourceId, :symbol, [])
|
101
|
+
end
|
102
|
+
otherId.compact.each { |qid|
|
103
|
+
# this section will solrize barcode and catkey, which live in otherId
|
104
|
+
(name, id) = qid.split(/:/, 2)
|
105
|
+
add_solr_value(solr_doc, 'dor_id', id, :symbol, [:stored_searchable])
|
106
|
+
add_solr_value(solr_doc, 'identifier', qid, :symbol, [:stored_searchable])
|
107
|
+
add_solr_value(solr_doc, "#{name}_id", id, :symbol, [])
|
108
|
+
}
|
109
|
+
|
110
|
+
# do some stuff to make tags in general and project tags specifically more easily searchable and facetable
|
111
|
+
find_by_terms(:tag).each { |tag|
|
112
|
+
(prefix, rest) = tag.text.split(/:/, 2)
|
113
|
+
prefix = prefix.downcase.strip.gsub(/\s/, '_')
|
114
|
+
unless rest.nil?
|
115
|
+
# this part will index a value in a field specific to the tag, e.g. registered_by_tag_*,
|
116
|
+
# book_tag_*, project_tag_*, remediated_by_tag_*, etc. project_tag_* and registered_by_tag_*
|
117
|
+
# definitley get used, but most don't. we can limit the prefixes that get solrized if things
|
118
|
+
# get out of hand.
|
119
|
+
add_solr_value(solr_doc, "#{prefix}_tag", rest.strip, :symbol, [])
|
120
|
+
end
|
121
|
+
|
122
|
+
# solrize each possible prefix for the tag, inclusive of the full tag.
|
123
|
+
# e.g., for a tag such as "A : B : C", this will solrize to an _ssim field
|
124
|
+
# that contains ["A", "A : B", "A : B : C"].
|
125
|
+
tag_parts = tag.text.split(/:/)
|
126
|
+
progressive_tag_prefix = ''
|
127
|
+
tag_parts.each_with_index do |part, index|
|
128
|
+
progressive_tag_prefix += ' : ' if index > 0
|
129
|
+
progressive_tag_prefix += part.strip
|
130
|
+
add_solr_value(solr_doc, 'exploded_tag', progressive_tag_prefix, :symbol, [])
|
131
|
+
end
|
132
|
+
}
|
133
|
+
|
134
|
+
solr_doc
|
135
|
+
end
|
133
136
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
end # class
|
137
|
+
# maintain AF < 8 indexing behavior
|
138
|
+
def prefix
|
139
|
+
''
|
140
|
+
end
|
141
|
+
end # class
|
139
142
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
# Represents the Fedora 3 datastream that hold provenance metadata
|
3
5
|
class ProvenanceMetadataDS < ActiveFedora::OmDatastream
|
4
6
|
# This provides the prefix for the solr fields generated by ActiveFedora.
|
5
7
|
# Since we don't want a prefix, we override this to return an empty string.
|
6
8
|
def prefix
|
7
|
-
''
|
9
|
+
''
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
class RightsMetadataDS < ActiveFedora::OmDatastream
|
3
5
|
require 'dor/rights_auth'
|
@@ -35,7 +37,7 @@ module Dor
|
|
35
37
|
xml.machine { xml.none }
|
36
38
|
}
|
37
39
|
xml.access(:type => 'read') {
|
38
|
-
xml.machine { xml.none }
|
40
|
+
xml.machine { xml.none } # dark default
|
39
41
|
}
|
40
42
|
xml.use {
|
41
43
|
xml.human(:type => 'useAndReproduction')
|
@@ -64,7 +66,6 @@ module Dor
|
|
64
66
|
'none' => 'Citation Only'
|
65
67
|
}.freeze
|
66
68
|
|
67
|
-
|
68
69
|
# just a wrapper to invalidate @dra_object
|
69
70
|
def content=(xml)
|
70
71
|
@dra_object = nil
|
@@ -112,7 +113,7 @@ module Dor
|
|
112
113
|
loc_node = Nokogiri::XML::Node.new('location', rights_xml)
|
113
114
|
loc_node.content = rights_type.split(':').last
|
114
115
|
machine_node.add_child(loc_node)
|
115
|
-
else
|
116
|
+
else # we know it is none or dark by the argument filter (first line)
|
116
117
|
machine_node.add_child Nokogiri::XML::Node.new('none', rights_xml)
|
117
118
|
end
|
118
119
|
end
|
@@ -215,6 +216,5 @@ module Dor
|
|
215
216
|
def prefix
|
216
217
|
''
|
217
218
|
end
|
218
|
-
|
219
219
|
end # class
|
220
220
|
end
|
@@ -1,55 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
|
-
class RoleMetadataDS < ActiveFedora::OmDatastream
|
3
|
-
|
4
|
+
class RoleMetadataDS < ActiveFedora::OmDatastream
|
5
|
+
include SolrDocHelper
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
+
set_terminology do |t|
|
8
|
+
t.root :path => 'roleMetadata'
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
10
|
+
t.actor do
|
11
|
+
t.identifier do
|
12
|
+
t.type_ :path => { :attribute => 'type' }
|
13
|
+
end
|
14
|
+
t.name
|
11
15
|
end
|
12
|
-
t.
|
13
|
-
|
14
|
-
t.person :ref => [:actor], :path => 'person'
|
15
|
-
t.group :ref => [:actor], :path => 'group'
|
16
|
+
t.person :ref => [:actor], :path => 'person'
|
17
|
+
t.group :ref => [:actor], :path => 'group'
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
t.role do
|
20
|
+
t.type_ :path => { :attribute => 'type' }
|
21
|
+
t.person :ref => [:person]
|
22
|
+
t.group :ref => [:group]
|
23
|
+
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
t.manager :ref => [:role], :attributes => { :type => 'manager' }
|
26
|
+
t.depositor :ref => [:role], :attributes => { :type => 'depositor' }
|
27
|
+
t.reviewer :ref => [:role], :attributes => { :type => 'reviewer' }
|
28
|
+
t.viewer :ref => [:role], :attributes => { :type => 'viewer' }
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
31
|
+
def self.xml_template
|
32
|
+
Nokogiri::XML::Builder.new do |xml|
|
33
|
+
xml.roleMetadata {}
|
34
|
+
end.doc
|
35
|
+
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
37
|
+
def to_solr(solr_doc = {}, *args)
|
38
|
+
find_by_xpath('/roleMetadata/role/*').each do |actor|
|
39
|
+
role_type = actor.parent['type']
|
40
|
+
val = [actor.at_xpath('identifier/@type'), actor.at_xpath('identifier/text()')].join ':'
|
41
|
+
add_solr_value(solr_doc, "apo_role_#{actor.name}_#{role_type}", val, :string, [:symbol])
|
42
|
+
add_solr_value(solr_doc, "apo_role_#{role_type}", val, :string, [:symbol])
|
43
|
+
if ['dor-apo-manager', 'dor-apo-depositor'].include? role_type
|
44
|
+
add_solr_value(solr_doc, 'apo_register_permissions', val, :string, [:symbol, :stored_searchable])
|
45
|
+
end
|
44
46
|
end
|
47
|
+
solr_doc
|
45
48
|
end
|
46
|
-
solr_doc
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
# maintain AF < 8 indexing behavior
|
51
|
+
def prefix
|
52
|
+
''
|
53
|
+
end
|
52
54
|
end
|
53
|
-
|
54
|
-
end
|
55
55
|
end
|
@@ -1,57 +1,59 @@
|
|
1
|
-
|
2
|
-
class SimpleDublinCoreDs < ActiveFedora::OmDatastream
|
3
|
-
|
4
|
-
set_terminology do |t|
|
5
|
-
t.root(
|
6
|
-
path: 'dc',
|
7
|
-
xmlns: 'http://www.openarchives.org/OAI/2.0/oai_dc/',
|
8
|
-
schema: 'http://cosimo.stanford.edu/standards/oai_dc/v2/oai_dc.xsd',
|
9
|
-
namespace_prefix: 'oai_dc',
|
10
|
-
index_as: [:not_searchable])
|
11
|
-
t.title( :index_as => [:stored_sortable, :stored_searchable], :xmlns => 'http://purl.org/dc/elements/1.1/', :namespace_prefix => 'dc')
|
12
|
-
t.creator( :index_as => [:stored_sortable, :stored_searchable], :xmlns => 'http://purl.org/dc/elements/1.1/', :namespace_prefix => 'dc')
|
13
|
-
t.identifier(:index_as => [:symbol, :stored_searchable], :xmlns => 'http://purl.org/dc/elements/1.1/', :namespace_prefix => 'dc')
|
14
|
-
end
|
1
|
+
# frozen_string_literal: true
|
15
2
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
3
|
+
module Dor
|
4
|
+
class SimpleDublinCoreDs < ActiveFedora::OmDatastream
|
5
|
+
set_terminology do |t|
|
6
|
+
t.root(
|
7
|
+
path: 'dc',
|
8
|
+
xmlns: 'http://www.openarchives.org/OAI/2.0/oai_dc/',
|
9
|
+
schema: 'http://cosimo.stanford.edu/standards/oai_dc/v2/oai_dc.xsd',
|
10
|
+
namespace_prefix: 'oai_dc',
|
11
|
+
index_as: [:not_searchable]
|
23
12
|
)
|
13
|
+
t.title(:index_as => [:stored_sortable, :stored_searchable], :xmlns => 'http://purl.org/dc/elements/1.1/', :namespace_prefix => 'dc')
|
14
|
+
t.creator(:index_as => [:stored_sortable, :stored_searchable], :xmlns => 'http://purl.org/dc/elements/1.1/', :namespace_prefix => 'dc')
|
15
|
+
t.identifier(:index_as => [:symbol, :stored_searchable], :xmlns => 'http://purl.org/dc/elements/1.1/', :namespace_prefix => 'dc')
|
24
16
|
end
|
25
17
|
|
26
|
-
|
27
|
-
|
18
|
+
def self.xml_template
|
19
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
20
|
+
xml['oai_dc'].dc(
|
21
|
+
'xmlns:oai_dc' => 'http://www.openarchives.org/OAI/2.0/oai_dc/',
|
22
|
+
'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
|
23
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
24
|
+
'xsi:schemaLocation' => 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd',
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
builder.doc
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
def to_solr(solr_doc = {}, *args)
|
32
|
+
# There are a whole bunch of namespace-related things that can go
|
33
|
+
# wrong with this terminology. Until it's fixed in OM, ignore them all.
|
32
34
|
|
33
|
-
|
35
|
+
doc = super solr_doc, *args
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
+
add_solr_value(doc, 'dc_title', title.first, :string, [:stored_sortable, :stored_searchable])
|
38
|
+
add_solr_value(doc, 'dc_creator', creator.first, :string, [:stored_sortable, :stored_searchable])
|
37
39
|
|
38
|
-
|
40
|
+
identifiers = {}
|
39
41
|
|
40
|
-
|
42
|
+
identifier.each { |i| ns, val = i.split(':'); identifiers[ns] ||= val }
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
identifiers.each do |ns, val|
|
45
|
+
add_solr_value(doc, "dc_identifier_#{ns}", val, :string, [:stored_sortable, :stored_searchable])
|
46
|
+
end
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
return doc
|
49
|
+
rescue Exception => e
|
50
|
+
warn "ERROR in SimpleDublinCoreDs to_solr()! #{e}"
|
51
|
+
solr_doc
|
52
|
+
end
|
51
53
|
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
# maintain AF < 8 indexing behavior
|
55
|
+
def prefix
|
56
|
+
''
|
57
|
+
end
|
55
58
|
end
|
56
59
|
end
|
57
|
-
end
|