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,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'cache'
|
2
4
|
|
3
5
|
module Dor
|
4
|
-
class MetadataError < Exception
|
6
|
+
class MetadataError < Exception; end
|
5
7
|
|
6
8
|
# class MetadataHandler
|
7
9
|
#
|
@@ -16,7 +18,6 @@ module Dor
|
|
16
18
|
# end
|
17
19
|
|
18
20
|
class MetadataService
|
19
|
-
|
20
21
|
class << self
|
21
22
|
@@cache = Cache.new(nil, nil, 250, 300)
|
22
23
|
|
@@ -64,6 +65,7 @@ module Dor
|
|
64
65
|
def handler_for(prefix)
|
65
66
|
handler = handlers[prefix.to_sym]
|
66
67
|
raise MetadataError, "Unkown metadata prefix: #{prefix}" if handler.nil?
|
68
|
+
|
67
69
|
handler
|
68
70
|
end
|
69
71
|
|
@@ -72,9 +74,7 @@ module Dor
|
|
72
74
|
def handlers
|
73
75
|
@handlers ||= {}
|
74
76
|
end
|
75
|
-
|
76
77
|
end
|
77
|
-
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -1,13 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
class PublicDescMetadataService
|
3
5
|
attr_reader :object
|
4
|
-
|
6
|
+
|
5
7
|
NOKOGIRI_DEEP_COPY = 1
|
6
8
|
|
7
9
|
def initialize(object)
|
8
10
|
@object = object
|
9
11
|
end
|
10
|
-
|
12
|
+
|
11
13
|
def doc
|
12
14
|
@doc ||= object.descMetadata.ng_xml.dup(NOKOGIRI_DEEP_COPY)
|
13
15
|
end
|
@@ -18,7 +20,7 @@ module Dor
|
|
18
20
|
add_access_conditions! if include_access_conditions
|
19
21
|
add_constituent_relations!
|
20
22
|
strip_comments!
|
21
|
-
|
23
|
+
|
22
24
|
new_doc = Nokogiri::XML(doc.to_xml) { |x| x.noblanks }
|
23
25
|
new_doc.encoding = 'UTF-8'
|
24
26
|
new_doc.to_xml
|
@@ -35,30 +37,36 @@ module Dor
|
|
35
37
|
# @note this method modifies the passed in doc
|
36
38
|
def add_access_conditions!
|
37
39
|
# clear out any existing accessConditions
|
38
|
-
doc.xpath('//mods:accessCondition', 'mods' => 'http://www.loc.gov/mods/v3').each {|n| n.remove}
|
40
|
+
doc.xpath('//mods:accessCondition', 'mods' => 'http://www.loc.gov/mods/v3').each { |n| n.remove }
|
39
41
|
rights = object.datastreams['rightsMetadata'].ng_xml
|
40
42
|
|
41
43
|
rights.xpath('//use/human[@type="useAndReproduction"]').each do |use|
|
42
44
|
txt = use.text.strip
|
43
45
|
next if txt.empty?
|
46
|
+
|
44
47
|
doc.root.element_children.last.add_next_sibling doc.create_element('accessCondition', txt, :type => 'useAndReproduction')
|
45
48
|
end
|
46
49
|
rights.xpath('//copyright/human[@type="copyright"]').each do |cr|
|
47
50
|
txt = cr.text.strip
|
48
51
|
next if txt.empty?
|
52
|
+
|
49
53
|
doc.root.element_children.last.add_next_sibling doc.create_element('accessCondition', txt, :type => 'copyright')
|
50
54
|
end
|
51
55
|
rights.xpath("//use/machine[#{ci_compare('type', 'creativecommons')}]").each do |lic_type|
|
52
56
|
next if lic_type.text =~ /none/i
|
57
|
+
|
53
58
|
lic_text = rights.at_xpath("//use/human[#{ci_compare('type', 'creativecommons')}]").text.strip
|
54
59
|
next if lic_text.empty?
|
60
|
+
|
55
61
|
new_text = "CC #{lic_type.text}: #{lic_text}"
|
56
62
|
doc.root.element_children.last.add_next_sibling doc.create_element('accessCondition', new_text, :type => 'license')
|
57
63
|
end
|
58
64
|
rights.xpath("//use/machine[#{ci_compare('type', 'opendatacommons')}]").each do |lic_type|
|
59
65
|
next if lic_type.text =~ /none/i
|
66
|
+
|
60
67
|
lic_text = rights.at_xpath("//use/human[#{ci_compare('type', 'opendatacommons')}]").text.strip
|
61
68
|
next if lic_text.empty?
|
69
|
+
|
62
70
|
new_text = "ODC #{lic_type.text}: #{lic_text}"
|
63
71
|
doc.root.element_children.last.add_next_sibling doc.create_element('accessCondition', new_text, :type => 'license')
|
64
72
|
end
|
@@ -69,8 +77,8 @@ module Dor
|
|
69
77
|
# @return [Void]
|
70
78
|
def add_constituent_relations!
|
71
79
|
object.public_relationships.search('//rdf:RDF/rdf:Description/fedora:isConstituentOf',
|
72
|
-
|
73
|
-
|
80
|
+
'fedora' => 'info:fedora/fedora-system:def/relations-external#',
|
81
|
+
'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#').each do |parent|
|
74
82
|
# fetch the parent object to get title
|
75
83
|
druid = parent['rdf:resource'].gsub(/^info:fedora\//, '')
|
76
84
|
parent_item = Dor.find(druid)
|
@@ -106,8 +114,8 @@ module Dor
|
|
106
114
|
# @note this method modifies the passed in doc
|
107
115
|
def add_collection_reference!
|
108
116
|
collections = object.public_relationships.search('//rdf:RDF/rdf:Description/fedora:isMemberOfCollection',
|
109
|
-
|
110
|
-
|
117
|
+
'fedora' => 'info:fedora/fedora-system:def/relations-external#',
|
118
|
+
'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
|
111
119
|
return if collections.empty?
|
112
120
|
|
113
121
|
remove_related_item_nodes_for_collections!
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
class PublicXmlService
|
3
5
|
attr_reader :object
|
@@ -35,7 +37,7 @@ module Dor
|
|
35
37
|
# @return [String] The XML release node as a string, with ReleaseDigest as the root document
|
36
38
|
def release_xml
|
37
39
|
@release_xml ||= begin
|
38
|
-
|
40
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
39
41
|
xml.releaseData {
|
40
42
|
object.released_for.each do |project, released_value|
|
41
43
|
xml.release(released_value['release'], :to => project)
|
@@ -65,14 +67,15 @@ module Dor
|
|
65
67
|
# @return [Nokogiri::XML::Document] sanitized for public consumption
|
66
68
|
def public_content_metadata
|
67
69
|
return Nokogiri::XML::Document.new unless object.datastreams['contentMetadata']
|
70
|
+
|
68
71
|
@public_content_metadata ||= begin
|
69
72
|
result = object.datastreams['contentMetadata'].ng_xml.clone
|
70
73
|
|
71
74
|
# remove any resources or attributes that are not destined for the public XML
|
72
75
|
result.xpath('/contentMetadata/resource[not(file[(@deliver="yes" or @publish="yes")]|externalFile)]').each(&:remove)
|
73
|
-
result.xpath('/contentMetadata/resource/file[not(@deliver="yes" or @publish="yes")]'
|
74
|
-
result.xpath('/contentMetadata/resource/file').xpath('@preserve|@shelve|@publish|@deliver'
|
75
|
-
result.xpath('/contentMetadata/resource/file/checksum'
|
76
|
+
result.xpath('/contentMetadata/resource/file[not(@deliver="yes" or @publish="yes")]').each(&:remove)
|
77
|
+
result.xpath('/contentMetadata/resource/file').xpath('@preserve|@shelve|@publish|@deliver').each(&:remove)
|
78
|
+
result.xpath('/contentMetadata/resource/file/checksum').each(&:remove)
|
76
79
|
|
77
80
|
# support for dereferencing links via externalFile element(s) to the source (child) item - see JUMBO-19
|
78
81
|
result.xpath('/contentMetadata/resource/externalFile').each do |externalFile|
|
@@ -1,10 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'uuidtools'
|
2
4
|
|
3
5
|
module Dor
|
4
6
|
class RegistrationService
|
5
|
-
|
6
7
|
class << self
|
7
|
-
|
8
8
|
# @TODO: Why isn't all this logic in, for example, Dor::Item.create? or Dor::Base.create? or Dor::Creatable.create?
|
9
9
|
# @TODO: these duplicate checks could be combined into 1 query
|
10
10
|
|
@@ -13,10 +13,12 @@ module Dor
|
|
13
13
|
# @raise [Dor::DuplicateIdError]
|
14
14
|
def unduplicated_pid(pid = nil)
|
15
15
|
return Dor::SuriService.mint_id unless pid
|
16
|
+
|
16
17
|
existing_pid = SearchService.query_by_id(pid).first
|
17
18
|
unless existing_pid.nil?
|
18
19
|
raise Dor::DuplicateIdError.new(existing_pid), "An object with the PID #{pid} has already been registered."
|
19
20
|
end
|
21
|
+
|
20
22
|
pid
|
21
23
|
end
|
22
24
|
|
@@ -28,6 +30,7 @@ module Dor
|
|
28
30
|
unless SearchService.query_by_id("#{source_id_string}").first.nil?
|
29
31
|
raise Dor::DuplicateIdError.new(source_id_string), "An object with the source ID '#{source_id_string}' has already been registered."
|
30
32
|
end
|
33
|
+
|
31
34
|
source_id_string
|
32
35
|
end
|
33
36
|
|
@@ -50,9 +53,10 @@ module Dor
|
|
50
53
|
raise Dor::ParameterError, "#{required_param.inspect} must be specified in call to #{name}.register_object" unless params[required_param]
|
51
54
|
end
|
52
55
|
metadata_source = params[:metadata_source]
|
53
|
-
if params[:label].length < 1 &&
|
56
|
+
if params[:label].length < 1 && %w[label none].include?(metadata_source)
|
54
57
|
raise Dor::ParameterError, "label cannot be empty to call #{name}.register_object"
|
55
58
|
end
|
59
|
+
|
56
60
|
object_type = params[:object_type]
|
57
61
|
item_class = Dor.registered_classes[object_type]
|
58
62
|
raise Dor::ParameterError, "Unknown item type: '#{object_type}'" if item_class.nil?
|
@@ -108,7 +112,7 @@ module Dor
|
|
108
112
|
if rights && %w(item collection).include?(object_type)
|
109
113
|
rights_xml = apo_object.defaultObjectRights.ng_xml
|
110
114
|
new_item.datastreams['rightsMetadata'].content = rights_xml.to_s
|
111
|
-
new_item.set_read_rights(rights) unless rights == 'default'
|
115
|
+
new_item.set_read_rights(rights) unless rights == 'default' # already defaulted to default!
|
112
116
|
end
|
113
117
|
# create basic mods from the label
|
114
118
|
if metadata_source == 'label'
|
@@ -126,7 +130,7 @@ module Dor
|
|
126
130
|
workflow_priority = params[:workflow_priority] ? params[:workflow_priority].to_i : 0
|
127
131
|
|
128
132
|
Array(params[:seed_datastream]).each { |datastream_name| new_item.build_datastream(datastream_name) }
|
129
|
-
Array(params[:initiate_workflow]).each { |workflow_id| new_item.create_workflow(workflow_id, !new_item.new_record?, workflow_priority)}
|
133
|
+
Array(params[:initiate_workflow]).each { |workflow_id| new_item.create_workflow(workflow_id, !new_item.new_record?, workflow_priority) }
|
130
134
|
|
131
135
|
new_item.assert_content_model
|
132
136
|
|
@@ -157,21 +161,21 @@ module Dor
|
|
157
161
|
end
|
158
162
|
|
159
163
|
dor_params = {
|
160
|
-
:pid
|
161
|
-
:admin_policy
|
162
|
-
:content_model
|
163
|
-
:label
|
164
|
-
:object_type
|
165
|
-
:other_ids
|
166
|
-
:parent
|
167
|
-
:source_id
|
168
|
-
:tags
|
169
|
-
:seed_datastream
|
170
|
-
:initiate_workflow
|
171
|
-
:rights
|
172
|
-
:metadata_source
|
173
|
-
:collection
|
174
|
-
:workflow_priority
|
164
|
+
:pid => params[:pid],
|
165
|
+
:admin_policy => params[:admin_policy],
|
166
|
+
:content_model => params[:model],
|
167
|
+
:label => params[:label],
|
168
|
+
:object_type => params[:object_type],
|
169
|
+
:other_ids => ids_to_hash(other_ids),
|
170
|
+
:parent => params[:parent],
|
171
|
+
:source_id => ids_to_hash(params[:source_id]),
|
172
|
+
:tags => params[:tag] || [],
|
173
|
+
:seed_datastream => params[:seed_datastream],
|
174
|
+
:initiate_workflow => Array(params[:initiate_workflow]) + Array(params[:workflow_id]),
|
175
|
+
:rights => params[:rights],
|
176
|
+
:metadata_source => params[:metadata_source],
|
177
|
+
:collection => params[:collection],
|
178
|
+
:workflow_priority => params[:workflow_priority]
|
175
179
|
}
|
176
180
|
dor_params.delete_if { |k, v| v.nil? }
|
177
181
|
|
@@ -185,6 +189,7 @@ module Dor
|
|
185
189
|
|
186
190
|
def ids_to_hash(ids)
|
187
191
|
return nil if ids.nil?
|
192
|
+
|
188
193
|
Hash[Array(ids).map { |id| id.split(':', 2) }]
|
189
194
|
end
|
190
195
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
# Rename the druid trees at the end of the accessionWF in order to be cleaned/deleted later.
|
3
5
|
class ResetWorkspaceService
|
4
|
-
|
5
6
|
def self.reset_workspace_druid_tree(druid, version, workspace_root)
|
6
7
|
druid_tree_path = DruidTools::Druid.new(druid, workspace_root).pathname.to_s
|
7
8
|
|
8
|
-
raise "The archived directory #{druid_tree_path}_v#{version} already existed." if
|
9
|
+
raise "The archived directory #{druid_tree_path}_v#{version} already existed." if File.exist?("#{druid_tree_path}_v#{version}")
|
9
10
|
|
10
11
|
if File.exist?(druid_tree_path)
|
11
12
|
FileUtils.mv(druid_tree_path, "#{druid_tree_path}_v#{version}")
|
@@ -16,7 +17,7 @@ module Dor
|
|
16
17
|
id = druid.split(':').last
|
17
18
|
bag_dir = File.join(export_root, id)
|
18
19
|
|
19
|
-
raise "The archived bag #{bag_dir}_v#{version} already existed." if
|
20
|
+
raise "The archived bag #{bag_dir}_v#{version} already existed." if File.exist?("#{bag_dir}_v#{version}")
|
20
21
|
|
21
22
|
FileUtils.mv(bag_dir, "#{bag_dir}_v#{version}") if File.exist?(bag_dir)
|
22
23
|
|
@@ -24,6 +25,5 @@ module Dor
|
|
24
25
|
FileUtils.mv("#{bag_dir}.tar", "#{bag_dir}_v#{version}.tar")
|
25
26
|
end
|
26
27
|
end
|
27
|
-
|
28
28
|
end
|
29
29
|
end
|
@@ -1,10 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'moab/stanford'
|
2
4
|
|
3
5
|
module Dor
|
4
6
|
# Note: This should probably live in common-accessioning robot sdr-ingest-transfer
|
5
7
|
# as that is the only robot that uses it. See also preservable concern.
|
6
8
|
class SdrIngestService
|
7
|
-
|
8
9
|
# @param [Dor::Item] dor_item The representation of the digital object
|
9
10
|
# @param [String] agreement_id depreciated, included for backward compatability with common-accessoning
|
10
11
|
# @return [void] Create the Moab/bag manifests for new version, export data to BagIt bag, kick off the SDR preservation workflow
|
@@ -95,6 +96,7 @@ module Dor
|
|
95
96
|
# @param [Integer] found The version number that is actually in the file
|
96
97
|
def self.verify_version_id(pathname, expected, found)
|
97
98
|
raise "Version mismatch in #{pathname}, expected #{expected}, found #{found}" unless expected == found
|
99
|
+
|
98
100
|
true
|
99
101
|
end
|
100
102
|
|
@@ -165,8 +167,8 @@ module Dor
|
|
165
167
|
# @return [Boolean] true if file exists, raises exception if not
|
166
168
|
def self.verify_pathname(pathname)
|
167
169
|
raise "#{pathname.basename} not found at #{pathname}" unless pathname.exist?
|
170
|
+
|
168
171
|
true
|
169
172
|
end
|
170
|
-
|
171
173
|
end
|
172
174
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'json'
|
2
4
|
require 'active_support/core_ext'
|
3
5
|
|
4
6
|
module Dor
|
5
7
|
class SearchService
|
6
|
-
|
7
|
-
RISEARCH_TEMPLATE = "select $object from <#ri> where $object <dc:identifier> '%s'".freeze
|
8
|
+
RISEARCH_TEMPLATE = "select $object from <#ri> where $object <dc:identifier> '%s'"
|
8
9
|
@@index_version = nil
|
9
10
|
|
10
11
|
class << self
|
11
|
-
|
12
12
|
def index_version
|
13
13
|
Dor::VERSION
|
14
14
|
end
|
@@ -17,12 +17,12 @@ module Dor
|
|
17
17
|
client = Config.fedora.client['risearch']
|
18
18
|
client.options[:timeout] = opts.delete(:timeout)
|
19
19
|
query_params = {
|
20
|
-
:type
|
21
|
-
:lang
|
20
|
+
:type => 'tuples',
|
21
|
+
:lang => 'itql',
|
22
22
|
:format => 'CSV',
|
23
|
-
:limit
|
23
|
+
:limit => '1000',
|
24
24
|
:stream => 'on',
|
25
|
-
:query
|
25
|
+
:query => query
|
26
26
|
}.merge(opts)
|
27
27
|
result = client.post(query_params)
|
28
28
|
result.split(/\n/)[1..-1].collect { |pid| pid.chomp.sub(/^info:fedora\//, '') }
|
@@ -50,6 +50,7 @@ module Dor
|
|
50
50
|
params[:start] ||= 0
|
51
51
|
resp = solr.get 'select', params: params
|
52
52
|
return resp unless block_given?
|
53
|
+
|
53
54
|
cont = true
|
54
55
|
while cont && resp['response']['docs'].length > 0
|
55
56
|
cont = yield(resp)
|
@@ -92,8 +93,6 @@ module Dor
|
|
92
93
|
r['response']['docs'].first[:id]
|
93
94
|
end
|
94
95
|
end
|
95
|
-
|
96
96
|
end
|
97
|
-
|
98
97
|
end
|
99
98
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rest-client'
|
2
4
|
require 'active_fedora'
|
3
5
|
|
@@ -13,7 +15,7 @@ module Dor
|
|
13
15
|
if Config.suri.mint_ids
|
14
16
|
# Post with no body
|
15
17
|
resource = RestClient::Resource.new("#{Config.suri.url}/suri2/namespaces/#{Config.suri.id_namespace}",
|
16
|
-
|
18
|
+
:user => Config.suri.user, :password => Config.suri.pass)
|
17
19
|
ids = resource["identifiers?quantity=#{quantity}"].post('').chomp.split(/\n/).collect { |id| "#{Config.suri.id_namespace}:#{id.strip}" }
|
18
20
|
else
|
19
21
|
repo = ActiveFedora::Base.respond_to?(:connection_for_pid) ? ActiveFedora::Base.connection_for_pid(0) : ActiveFedora.fedora.connection
|
@@ -32,6 +34,5 @@ module Dor
|
|
32
34
|
# Rails.logger.error("Unable to mint id from suri: #{e.to_s}")
|
33
35
|
# raise e
|
34
36
|
end
|
35
|
-
|
36
37
|
end
|
37
38
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
require 'moab/stanford'
|
3
5
|
require 'jhove_service'
|
@@ -5,7 +7,6 @@ require 'dor-services'
|
|
5
7
|
|
6
8
|
module Dor
|
7
9
|
class TechnicalMetadataService
|
8
|
-
|
9
10
|
# @param [Dor::Item] dor_item The DOR item being processed by the technical metadata robot
|
10
11
|
# @return [Boolean] True if technical metadata is correctly added or updated
|
11
12
|
def self.add_update_technical_metadata(dor_item)
|
@@ -71,6 +72,7 @@ module Dor
|
|
71
72
|
def self.get_old_technical_metadata(dor_item)
|
72
73
|
sdr_techmd = get_sdr_technical_metadata(dor_item.pid)
|
73
74
|
return sdr_techmd unless sdr_techmd.nil?
|
75
|
+
|
74
76
|
get_dor_technical_metadata(dor_item)
|
75
77
|
end
|
76
78
|
|
@@ -81,6 +83,7 @@ module Dor
|
|
81
83
|
sdr_techmd = get_sdr_metadata(druid, 'technicalMetadata')
|
82
84
|
return sdr_techmd if sdr_techmd =~ /<technicalMetadata/
|
83
85
|
return ::JhoveService.new.upgrade_technical_metadata(sdr_techmd) if sdr_techmd =~ /<jhove/
|
86
|
+
|
84
87
|
nil
|
85
88
|
end
|
86
89
|
|
@@ -90,9 +93,11 @@ module Dor
|
|
90
93
|
def self.get_dor_technical_metadata(dor_item)
|
91
94
|
ds = 'technicalMetadata'
|
92
95
|
return nil unless dor_item.datastreams.keys.include?(ds) && !dor_item.datastreams[ds].new?
|
96
|
+
|
93
97
|
dor_techmd = dor_item.datastreams[ds].content
|
94
98
|
return dor_techmd if dor_techmd =~ /<technicalMetadata/
|
95
99
|
return ::JhoveService.new.upgrade_technical_metadata(dor_techmd) if dor_techmd =~ /<jhove/
|
100
|
+
|
96
101
|
nil
|
97
102
|
end
|
98
103
|
|
@@ -108,6 +113,7 @@ module Dor
|
|
108
113
|
# @return [String] The technicalMetadata datastream for the new files of the new digital object version
|
109
114
|
def self.get_new_technical_metadata(druid, new_files)
|
110
115
|
return nil if new_files.nil? || new_files.empty?
|
116
|
+
|
111
117
|
workspace = DruidTools::Druid.new(druid, Dor::Config.sdr.local_workspace_root)
|
112
118
|
content_dir = workspace.find_filelist_parent('content', new_files)
|
113
119
|
temp_dir = workspace.temp_dir
|
@@ -124,7 +130,7 @@ module Dor
|
|
124
130
|
# @return [Pathname] Save the new_files list to a text file and return that file's name
|
125
131
|
def self.write_fileset(temp_dir, new_files)
|
126
132
|
fileset_pathname = Pathname(temp_dir).join('jhove_fileset.txt')
|
127
|
-
fileset_pathname.open('w') {|f| f.puts(new_files) }
|
133
|
+
fileset_pathname.open('w') { |f| f.puts(new_files) }
|
128
134
|
fileset_pathname
|
129
135
|
end
|
130
136
|
|
@@ -163,6 +169,7 @@ module Dor
|
|
163
169
|
def self.get_file_nodes(technical_metadata)
|
164
170
|
file_hash = {}
|
165
171
|
return file_hash if technical_metadata.nil?
|
172
|
+
|
166
173
|
current_file = []
|
167
174
|
path = nil
|
168
175
|
in_file = false
|
@@ -188,16 +195,15 @@ module Dor
|
|
188
195
|
# @param [Hash<String,Nokogiri::XML::Node>] merged_nodes The complete set of technicalMetadata nodes for the digital object, indexed by filename
|
189
196
|
# @return [String] The finalized technicalMetadata datastream contents for the new object version
|
190
197
|
def self.build_technical_metadata(druid, merged_nodes)
|
191
|
-
techmd_root =
|
192
|
-
<technicalMetadata objectId='#{druid}' datetime='#{Time.now.utc.iso8601}'
|
193
|
-
|
194
|
-
|
195
|
-
|
198
|
+
techmd_root = +<<~EOF
|
199
|
+
<technicalMetadata objectId='#{druid}' datetime='#{Time.now.utc.iso8601}'
|
200
|
+
xmlns:jhove='http://hul.harvard.edu/ois/xml/ns/jhove'
|
201
|
+
xmlns:mix='http://www.loc.gov/mix/v10'
|
202
|
+
xmlns:textmd='info:lc/xmlns/textMD-v3'>
|
196
203
|
EOF
|
197
204
|
doc = techmd_root
|
198
|
-
merged_nodes.keys.sort.each {|path| doc << merged_nodes[path] }
|
205
|
+
merged_nodes.keys.sort.each { |path| doc << merged_nodes[path] }
|
199
206
|
doc + '</technicalMetadata>'
|
200
207
|
end
|
201
|
-
|
202
208
|
end
|
203
209
|
end
|