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,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
|