dor-services 2.2.4 → 4.4.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +15 -0
  2. data/bin/dor-indexer +108 -0
  3. data/bin/dor-indexerd +73 -0
  4. data/bin/nokogiri +19 -0
  5. data/bin/rake +19 -0
  6. data/bin/ruby_noexec_wrapper +14 -0
  7. data/bin/solrizer +19 -0
  8. data/bin/solrizerd +19 -0
  9. data/config/certs/README +1 -0
  10. data/config/config_defaults.yml +62 -0
  11. data/config/dev_console_env.rb.example +67 -0
  12. data/config/predicate_mappings.yml +55 -0
  13. data/lib/dor-services.rb +152 -19
  14. data/lib/dor/config.rb +133 -35
  15. data/lib/dor/datastreams/administrative_metadata_ds.rb +84 -0
  16. data/lib/dor/datastreams/content_metadata_ds.rb +337 -0
  17. data/lib/dor/datastreams/datastream_spec_solrizer.rb +18 -0
  18. data/lib/dor/datastreams/default_object_rights_ds.rb +52 -0
  19. data/lib/dor/datastreams/desc_metadata_ds.rb +39 -0
  20. data/lib/{datastreams → dor/datastreams}/embargo_metadata_ds.rb +25 -20
  21. data/lib/{datastreams → dor/datastreams}/events_ds.rb +14 -9
  22. data/lib/dor/datastreams/identity.xsl +8 -0
  23. data/lib/dor/datastreams/identity_metadata_ds.rb +112 -0
  24. data/lib/dor/datastreams/role_metadata_ds.rb +51 -0
  25. data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -0
  26. data/lib/dor/datastreams/version_metadata_ds.rb +214 -0
  27. data/lib/dor/datastreams/workflow_definition_ds.rb +113 -0
  28. data/lib/dor/datastreams/workflow_ds.rb +103 -0
  29. data/lib/dor/exceptions.rb +0 -1
  30. data/lib/dor/migrations/content_metadata_ds/change_content_type.rb +7 -0
  31. data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +9 -0
  32. data/lib/dor/migrations/identifiable/fix_model_assertions.rb +13 -0
  33. data/lib/dor/migrations/identifiable/record_remediation.rb +18 -0
  34. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +18 -0
  35. data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +18 -0
  36. data/lib/dor/migrations/processable/unify_workflows.rb +17 -0
  37. data/lib/dor/migrations/versionable/add_missing_version_md.rb +9 -0
  38. data/lib/dor/models/admin_policy_object.rb +16 -0
  39. data/lib/dor/models/assembleable.rb +14 -0
  40. data/lib/dor/models/collection.rb +14 -0
  41. data/lib/dor/models/contentable.rb +227 -0
  42. data/lib/dor/models/describable.rb +194 -0
  43. data/lib/dor/models/discoverable.rb +66 -0
  44. data/lib/dor/models/editable.rb +267 -0
  45. data/lib/dor/models/embargoable.rb +97 -0
  46. data/lib/dor/models/eventable.rb +12 -0
  47. data/lib/dor/models/governable.rb +162 -0
  48. data/lib/dor/models/identifiable.rb +211 -0
  49. data/lib/dor/models/item.rb +44 -0
  50. data/lib/dor/models/itemizable.rb +66 -0
  51. data/lib/dor/{mods2dc.xslt → models/mods2dc.xslt} +39 -12
  52. data/lib/dor/models/preservable.rb +50 -0
  53. data/lib/dor/models/processable.rb +229 -0
  54. data/lib/dor/models/publishable.rb +74 -0
  55. data/lib/dor/models/set.rb +12 -0
  56. data/lib/dor/models/shelvable.rb +27 -0
  57. data/lib/dor/models/upgradable.rb +74 -0
  58. data/lib/dor/models/versionable.rb +94 -0
  59. data/lib/dor/models/workflow_object.rb +54 -0
  60. data/lib/dor/services/cleanup_service.rb +47 -0
  61. data/lib/dor/services/digital_stacks_service.rb +55 -0
  62. data/lib/dor/services/merge_service.rb +96 -0
  63. data/lib/dor/{metadata_handlers → services/metadata_handlers}/catalog_handler.rb +0 -2
  64. data/lib/dor/{metadata_handlers → services/metadata_handlers}/mdtoolkit_handler.rb +0 -2
  65. data/lib/dor/{metadata_service.rb → services/metadata_service.rb} +1 -3
  66. data/lib/dor/services/registration_service.rb +181 -0
  67. data/lib/dor/services/sdr_ingest_service.rb +181 -0
  68. data/lib/dor/services/search_service.rb +131 -0
  69. data/lib/dor/services/suri_service.rb +32 -0
  70. data/lib/dor/services/technical_metadata_service.rb +226 -0
  71. data/lib/dor/{tei2dc.xslt → services/tei2dc.xslt} +0 -0
  72. data/lib/dor/utils/ng_tidy.rb +37 -0
  73. data/lib/dor/utils/predicate_patch.rb +23 -0
  74. data/lib/dor/utils/solr_doc_helper.rb +9 -0
  75. data/lib/dor/utils/utc_date_field_mapper.rb +7 -0
  76. data/lib/dor/version.rb +3 -0
  77. data/lib/dor/workflow/document.rb +131 -0
  78. data/lib/dor/workflow/graph.rb +166 -0
  79. data/lib/dor/workflow/process.rb +99 -0
  80. data/lib/gsearch/demoFoxmlToSolr.xslt +340 -122
  81. data/lib/tasks/dor.rake +39 -0
  82. metadata +494 -384
  83. data/lib/datastreams/content_metadata_ds.rb +0 -12
  84. data/lib/datastreams/identity_metadata_ds.rb +0 -28
  85. data/lib/datastreams/ng_tidy.rb +0 -19
  86. data/lib/datastreams/simple_dublin_core_ds.rb +0 -23
  87. data/lib/datastreams/workflow_definition_ds.rb +0 -105
  88. data/lib/datastreams/workflow_ds.rb +0 -16
  89. data/lib/dor/admin_policy_object.rb +0 -11
  90. data/lib/dor/base.rb +0 -81
  91. data/lib/dor/cleanup_service.rb +0 -32
  92. data/lib/dor/digital_stacks_service.rb +0 -82
  93. data/lib/dor/druid_utils.rb +0 -41
  94. data/lib/dor/embargo.rb +0 -41
  95. data/lib/dor/item.rb +0 -141
  96. data/lib/dor/provenance_metadata_service.rb +0 -65
  97. data/lib/dor/registration_service.rb +0 -87
  98. data/lib/dor/rsolr.rb +0 -27
  99. data/lib/dor/sdr_ingest_service.rb +0 -117
  100. data/lib/dor/search_service.rb +0 -86
  101. data/lib/dor/suri_service.rb +0 -37
  102. data/lib/dor/workflow_object.rb +0 -13
  103. data/lib/dor/workflow_service.rb +0 -111
  104. data/lib/xml_models/foxml.rb +0 -261
  105. data/lib/xml_models/identity_metadata/dublin_core.rb +0 -119
  106. data/lib/xml_models/identity_metadata/identity_metadata.rb +0 -288
@@ -1,41 +0,0 @@
1
- require 'datastreams/embargo_metadata_ds'
2
- require 'datastreams/events_ds'
3
-
4
- module Dor
5
-
6
- # These methods manipulate the object for embargo purposes
7
- # They assume the object has embargoMetadata, rightsMetadata, and events datastreams
8
- module Embargo
9
-
10
- # Manipulates datastreams in the object when embargo is lifted:
11
- # Sets embargo status to released in embargoMetadata
12
- # Modifies rightsMetadata to remove embargoReleaseDate and updates/adds access from embargoMetadata/releaseAccess
13
- # @param [String] release_agent name of the person, application or thing that released embargo
14
- # @note The caller should save the object to fedora to commit the changes
15
- def release_embargo(release_agent="unknown")
16
- # Set status to released
17
- embargo_md = datastreams['embargoMetadata']
18
- embargo_md.status = 'released'
19
-
20
- # Remove embargoReleaseDate from rights
21
- rights_xml = datastreams['rightsMetadata'].ng_xml
22
- rights_xml.xpath("//rightsMetadata/access[@type='read']/machine/embargoReleaseDate").remove
23
-
24
- # Replace rights <access> nodes with those from embargoMetadta
25
- release_access = embargo_md.release_access_node
26
- release_access.xpath('//releaseAccess/access').each do |new_access|
27
- type = new_access['type']
28
- rights_xml.xpath("//rightsMetadata/access[@type='#{type}']").remove
29
- access_sibling = rights_xml.at_xpath("//rightsMetadata/access[last()]")
30
- if(access_sibling)
31
- access_sibling.add_next_sibling(new_access.clone)
32
- else
33
- rights_xml.root.add_child(new_access.clone)
34
- end
35
- end
36
-
37
- datastreams['rightsMetadata'].dirty = true
38
- datastreams['events'].add_event("embargo", release_agent, "Embargo released")
39
- end
40
- end
41
- end
@@ -1,141 +0,0 @@
1
- require 'dor/base'
2
- require 'datastreams/content_metadata_ds'
3
- require 'datastreams/ng_tidy'
4
- require 'tmpdir'
5
-
6
- module Dor
7
-
8
- class Item < Base
9
-
10
- has_metadata :name => "contentMetadata", :type => ContentMetadataDS
11
- has_metadata :name => "descMetadata", :type => ActiveFedora::NokogiriDatastream
12
- has_metadata :name => "rightsMetadata", :type => ActiveFedora::NokogiriDatastream
13
- has_metadata :name => "provenanceMetadata", :type => ActiveFedora::NokogiriDatastream
14
- has_metadata :name => "technicalMetadata", :type => ActiveFedora::NokogiriDatastream
15
-
16
- def admin_policy_object
17
- apo_ref = Array(self.rels_ext.relationships[:self]['hydra_isGovernedBy']).first
18
- if apo_ref.nil?
19
- return nil
20
- else
21
- apo_id = apo_ref.value.split(%r{/}).last
22
- if apo_id.empty?
23
- return nil
24
- else
25
- return Dor::AdminPolicyObject.load_instance(apo_id)
26
- end
27
- end
28
- end
29
-
30
- def fetch_descMetadata_datastream
31
- candidates = self.identity_metadata.otherIds.collect { |oid| oid.to_s }
32
- metadata_id = Dor::MetadataService.resolvable(candidates).first
33
- unless metadata_id.nil?
34
- return Dor::MetadataService.fetch(metadata_id.to_s)
35
- else
36
- return nil
37
- end
38
- end
39
-
40
- def build_contentMetadata_datastream(ds)
41
- path = Druid.new(self.pid).path(Dor::Config.stacks.local_workspace_root)
42
- if File.exists?(File.join(path, 'content_metadata.xml'))
43
- ds.label = 'Content Metadata'
44
- ds.ng_xml = Nokogiri::XML(File.read(File.join(path, 'content_metadata.xml')))
45
- end
46
- end
47
-
48
- def build_descMetadata_datastream(ds)
49
- content = fetch_descMetadata_datastream
50
- unless content.nil?
51
- ds.label = 'Descriptive Metadata'
52
- ds.ng_xml = Nokogiri::XML(content)
53
- ds.ng_xml.normalize_text!
54
- end
55
- end
56
-
57
- def build_rightsMetadata_datastream(ds)
58
- content_ds = self.admin_policy_object.datastreams['defaultObjectRights']
59
- ds.label = 'Rights Metadata'
60
- ds.ng_xml = content_ds.ng_xml.clone
61
- end
62
-
63
- def public_xml
64
- pub = Nokogiri::XML("<publicObject/>").root
65
- pub['id'] = pid
66
- pub.add_child(self.datastreams['identityMetadata'].ng_xml.root.clone)
67
- pub.add_child(self.datastreams['contentMetadata'].public_xml.root.clone)
68
- pub.add_child(self.datastreams['rightsMetadata'].ng_xml.root.clone)
69
- pub.add_child(generate_dublin_core.root)
70
- Nokogiri::XML(pub.to_xml) { |x| x.noblanks }.to_xml { |config| config.no_declaration }
71
- end
72
-
73
- # Generates Dublin Core from the MODS in the descMetadata datastream using the LoC mods2dc stylesheet
74
- # Should not be used for the Fedora DC datastream
75
- def generate_dublin_core
76
- apo = self.admin_policy_object
77
- format = apo.nil? ? 'mods' : apo.datastreams['administrativeMetadata'].ng_xml.at('/administrativeMetadata/descMetadata/format').text.downcase
78
- xslt = Nokogiri::XSLT(File.new(File.expand_path(File.dirname(__FILE__) + "/#{format}2dc.xslt")) )
79
- xslt.transform(self.datastreams['descMetadata'].ng_xml)
80
- end
81
-
82
- def publish_metadata
83
- DigitalStacksService.transfer_to_document_store(pid, self.datastreams['identityMetadata'].to_xml, 'identityMetadata')
84
- DigitalStacksService.transfer_to_document_store(pid, self.datastreams['contentMetadata'].to_xml, 'contentMetadata')
85
- DigitalStacksService.transfer_to_document_store(pid, self.datastreams['rightsMetadata'].to_xml, 'rightsMetadata')
86
- dc_xml = self.generate_dublin_core.to_xml {|config| config.no_declaration}
87
- DigitalStacksService.transfer_to_document_store(pid, dc_xml, 'dc')
88
- DigitalStacksService.transfer_to_document_store(pid, public_xml, 'public')
89
- end
90
-
91
- def build_provenanceMetadata_datastream(workflow_id, event_text)
92
- ProvenanceMetadataService.add_provenance(self, workflow_id, event_text)
93
- end
94
-
95
- def build_technicalMetadata_datastream(ds)
96
- unless defined? ::JhoveService
97
- begin
98
- require 'jhove_service'
99
- rescue LoadError => e
100
- puts e.inspect
101
- raise "jhove-service dependency gem was not found. Please add it to your Gemfile and run bundle install"
102
- end
103
- end
104
- begin
105
- content_dir = Druid.new(self.pid).path(Config.sdr.local_workspace_root)
106
- temp_dir = Dir.mktmpdir(self.pid)
107
- jhove_service = ::JhoveService.new(temp_dir)
108
- jhove_output_file = jhove_service.run_jhove(content_dir)
109
- tech_md_file = jhove_service.create_technical_metadata(jhove_output_file)
110
- ds.label = 'Technical Metadata'
111
- ds.ng_xml = Nokogiri::XML(IO.read(tech_md_file))
112
- ensure
113
- FileUtils.remove_entry_secure(temp_dir) if File.exist?(temp_dir)
114
- end
115
- end
116
-
117
- def shelve
118
- files = [] # doc.xpath("//file").select {|f| f['shelve'] == 'yes'}.map{|f| f['id']}
119
- self.datastreams['contentMetadata'].ng_xml.xpath('//file').each do |file|
120
- files << file['id'] if(file['shelve'].downcase == 'yes')
121
- end
122
-
123
- DigitalStacksService.shelve_to_stacks(pid, files)
124
- end
125
-
126
- def sdr_ingest_transfer(agreement_id)
127
- SdrIngestService.transfer(self,agreement_id)
128
- end
129
-
130
- def cleanup()
131
- CleanupService.cleanup(self)
132
- end
133
-
134
- def initiate_apo_workflow(name)
135
- wf_xml = admin_policy_object.datastreams['administrativeMetadata'].ng_xml.xpath(%{//workflow[@id="#{name}"]}).first.to_xml
136
- Dor::WorkflowService.create_workflow('dor',self.pid,name,wf_xml)
137
- end
138
-
139
- end
140
-
141
- end
@@ -1,65 +0,0 @@
1
- require 'nokogiri'
2
- require 'date'
3
- require 'time'
4
-
5
- module Dor
6
- class ProvenanceMetadataService
7
-
8
- def self.add_provenance(dor_item, workflow_id, event_text)
9
- druid = dor_item.pid
10
- # workflow_xml = get_workflow_xml(druid, workflow_id)
11
- workflow_provenance = create_workflow_provenance(druid, workflow_id, event_text)
12
- dsname = 'provenanceMetadata'
13
- if dor_item.datastream_names.include?(dsname)
14
- ds = dor_item.datastreams[dsname]
15
- old_provenance = ds.content
16
- ds.ng_xml = update_provenance(old_provenance, workflow_provenance)
17
- else
18
- ds = dor_item.datastreams[dsname]
19
- ds.label = 'Provenance Metadata'
20
- ds.ng_xml = workflow_provenance
21
- end
22
- ds.save
23
- end
24
-
25
- # not used
26
- def self.get_workflow_xml(druid, workflow_id)
27
- Dor::WorkflowService.get_workflow_xml('dor', druid, workflow_id)
28
- end
29
-
30
- # @return [String]
31
- def self.create_workflow_provenance(druid, workflow_id, event_text)
32
- builder = Nokogiri::XML::Builder.new do |xml|
33
- xml.provenanceMetadata(:objectId => druid) {
34
- xml.agent(:name => 'DOR') {
35
- xml.what(:object => druid) {
36
- xml.event(:who => "DOR-#{workflow_id}", :when => Time.new.iso8601) {
37
- xml.text(event_text)
38
- }
39
- }
40
- }
41
- }
42
- end
43
- builder.doc
44
- end
45
-
46
- # Reformat the XML
47
- # @param[String]
48
- def self.parse_xml_remove_blank_nodes(old_provenance)
49
- # http://blog.slashpoundbang.com/post/1454850669/how-to-pretty-print-xml-with-nokogiri
50
- Nokogiri::XML(old_provenance) { |x| x.noblanks }
51
- end
52
-
53
- # Append new stanzas in the contentMetadata for the googleMETS and technicalMetadata files
54
- # @param[String, Hash<Symbol,String>]
55
- def self.update_provenance(old_provenance, workflow_provenance)
56
- pm_xml = Nokogiri::XML(old_provenance)
57
- builder = Nokogiri::XML::Builder.with(pm_xml.at 'provenanceMetadata') do |xml|
58
- xml << workflow_provenance.xpath('/provenanceMetadata/agent').first.to_xml
59
- end
60
- parse_xml_remove_blank_nodes(builder.to_xml)
61
- end
62
-
63
- end
64
-
65
- end
@@ -1,87 +0,0 @@
1
- require 'active_fedora'
2
- require 'uuidtools'
3
- require 'xml_models/foxml'
4
- require 'xml_models/identity_metadata/identity_metadata'
5
-
6
- require 'dor/search_service'
7
-
8
- module Dor
9
-
10
- class RegistrationService
11
-
12
- class << self
13
- def register_object(params = {})
14
- [:object_type, :label].each do |required_param|
15
- unless params[required_param]
16
- raise Dor::ParameterError, "#{required_param.inspect} must be specified in call to #{self.name}.register_object"
17
- end
18
- end
19
-
20
- object_type = params[:object_type]
21
- content_model = params[:content_model]
22
- admin_policy = params[:admin_policy]
23
- label = params[:label]
24
- source_id = params[:source_id] || {}
25
- other_ids = params[:other_ids] || {}
26
- tags = params[:tags] || []
27
- parent = params[:parent]
28
- pid = nil
29
- if params[:pid]
30
- pid = params[:pid]
31
- existing_pid = SearchService.query_by_id(pid).first
32
- unless existing_pid.nil?
33
- raise Dor::DuplicateIdError.new(existing_pid), "An object with the PID #{pid} has already been registered."
34
- end
35
- else
36
- pid = Dor::SuriService.mint_id
37
- end
38
-
39
- if (other_ids.has_key?(:uuid) or other_ids.has_key?('uuid')) == false
40
- other_ids[:uuid] = UUIDTools::UUID.timestamp_create.to_s
41
- end
42
-
43
- apo_object = Dor::AdminPolicyObject.load_instance(admin_policy)
44
- adm_xml = apo_object.datastreams['administrativeMetadata'].ng_xml
45
- agreement_id = adm_xml.at('/administrativeMetadata/registration/agreementId/text()').to_s
46
-
47
- idmd = IdentityMetadata.new
48
-
49
- unless source_id.empty?
50
- source_name = source_id.keys.first
51
- source_value = source_id[source_name]
52
- existing_pid = SearchService.query_by_id("#{source_name}:#{source_value}").first
53
- unless existing_pid.nil?
54
- raise Dor::DuplicateIdError.new(existing_pid), "An object with the source ID '#{source_name}:#{source_value}' has already been registered."
55
- end
56
- idmd.sourceId.source = source_name
57
- idmd.sourceId.value = source_value
58
- end
59
-
60
- idmd.objectId = pid
61
- idmd.objectCreators << 'DOR'
62
- idmd.objectLabels << label
63
- idmd.objectTypes << object_type
64
- idmd.adminPolicy = admin_policy
65
- idmd.agreementId = agreement_id
66
- other_ids.each_pair { |name,value| idmd.add_identifier(name,value) }
67
- tags.each { |tag| idmd.add_tag(tag) }
68
-
69
- foxml = Foxml.new(pid, label, content_model, idmd.to_xml, parent)
70
- foxml.admin_policy_object = admin_policy
71
- rdf = foxml.xml.at('//rdf:Description', { 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' })
72
- rels = adm_xml.xpath('/administrativeMetadata/relationships/*')
73
- rels.each { |rel| rdf.add_child(rel.clone) }
74
-
75
- repo = ActiveFedora.fedora
76
- http_response = repo.ingest(foxml.to_xml(:undent_datastreams => true))
77
- result = {
78
- :response => http_response,
79
- :pid => pid
80
- }
81
- return(result)
82
- end
83
- end
84
-
85
- end
86
-
87
- end
@@ -1,27 +0,0 @@
1
- require 'rest-client'
2
-
3
- module Dor
4
-
5
- class RSolrConnection
6
-
7
- def execute client, request_context
8
- $stderr.puts request_context.inspect
9
- resource = RestClient::Resource.new(
10
- request_context[:uri].to_s,
11
- :ssl_client_cert => OpenSSL::X509::Certificate.new(File.read(Dor::Config.fedora.cert_file)),
12
- :ssl_client_key => OpenSSL::PKey::RSA.new(File.read(Dor::Config.fedora.key_file), Dor::Config.fedora.key_pass)
13
- )
14
- result = {}
15
- resource.send(request_context[:method]) { |response, request, result, &block|
16
- result = {
17
- :status => response.net_http_res.code.to_i,
18
- :headers => response.net_http_res.to_hash,
19
- :body => response.net_http_res.body
20
- }
21
- }
22
- result
23
- end
24
-
25
- end
26
-
27
- end
@@ -1,117 +0,0 @@
1
- require 'lyber-utils'
2
-
3
- module Dor
4
- class SdrIngestService
5
-
6
- Config.declare(:sdr) do
7
- local_workspace_root '/dor/workspace'
8
- local_export_home '/dor/export'
9
- datastreams do
10
- contentMetadata 'required'
11
- descMetadata 'required'
12
- identityMetadata 'required'
13
- provenanceMetadata 'required'
14
- relationshipMetadata 'required'
15
- technicalMetadata 'required'
16
- rightsMetadata 'optional'
17
- sourceMetadata 'optional'
18
- end
19
- end
20
-
21
- # Some boilerplace entries for the bagit metadata file
22
- METADATA_INFO = {
23
- 'Source-Organization' => 'Stanford University Libraries',
24
- 'Stanford-Content-Metadata' => 'data/metadata/contentMetadata.xml',
25
- 'Stanford-Identity-Metadata' => 'data/metadata/identityMetadata.xml',
26
- 'Stanford-Provenance-Metadata' => 'data/metadata/provenanceMetadata.xml'
27
- }
28
-
29
- # Create a bagit object and fill it with content
30
- # Then tar it
31
- # @param [LyberCore::Robots::WorkItem]
32
- def self.transfer(dor_item, agreement_id)
33
- druid = dor_item.pid
34
- content_dir = Druid.new(druid).path(Config.sdr.local_workspace_root)
35
-
36
- # Create the bag
37
- bag_dir = File.join(Config.sdr.local_export_home, druid)
38
- export_bag = LyberUtils::BagitBag.new(bag_dir)
39
-
40
- # Fill the bag
41
- export_bag.add_content_files(content_dir, use_links=true)
42
- add_metadata_datastreams(dor_item, export_bag)
43
- export_bag.write_metadata_info(metadata_info(druid, agreement_id))
44
- export_bag.write_manifests()
45
- export_bag.validate()
46
-
47
- unless LyberUtils::FileUtilities.tar_object(bag_dir)
48
- raise 'Unable to tar the bag'
49
- end
50
-
51
- # Now bootstrap SDR workflow queue to start SDR robots
52
- Dor::WorkflowService.create_workflow('sdr', druid, 'sdrIngestWF', read_sdr_workflow_xml(), {:create_ds => false})
53
- end
54
-
55
- # Read in the XML file needed to initialize the SDR workflow
56
- # @return [String]
57
- def self.read_sdr_workflow_xml()
58
- return IO.read(File.join("#{ROBOT_ROOT}", "config", "workflows", "sdrIngestWF", "sdrIngestWF.xml"))
59
- end
60
-
61
- # For each of the metadata files or datastreams, create a file in in the bag's data/metadata folder
62
- # @param[String, LyberUtils::BagitBag]
63
- def self.add_metadata_datastreams(dor_item, export_bag)
64
- Config.sdr.datastreams.to_hash.each_pair do |ds_name, required|
65
- # ds_name in this context is a symbol, so convert it to a string
66
- filename = "#{ds_name.to_s}.xml"
67
- metadata_string = self.get_datastream_content(dor_item, ds_name.to_s, required)
68
- self.export_metadata_string(metadata_string, filename, export_bag) unless metadata_string.nil?
69
- end
70
- end
71
-
72
- # create a link to a metadata file in the bag's data/metadata folder
73
- def self.export_metadata_file(metadata_dir, filename, bag)
74
- metadata_file = File.join(metadata_dir, filename)
75
- bag_metadata_dir = File.join(bag.bag_dir, 'data', 'metadata')
76
- if (File.exist?(metadata_file))
77
- bag_file = File.join(bag_metadata_dir, filename)
78
- File.link(metadata_file, bag_file)
79
- return true
80
- else
81
- return false
82
- end
83
- end
84
-
85
- # return the content of the specied datastream if it exists
86
- # if non-existant, return nil or raise exception depending on value of required
87
- def self.get_datastream_content(dor_item, ds_name, required)
88
- ds = (ds_name == 'relationshipMetadata' ? 'RELS-EXT' : ds_name)
89
- if dor_item.datastreams_in_fedora.keys.include?(ds)
90
- return dor_item.datastreams[ds].content
91
- elsif (required == 'optional')
92
- return nil
93
- else
94
- raise "required datastream #{ds_name} not found in DOR"
95
- end
96
- end
97
-
98
- # create a file in the bag's data/metadata folder containing the metadata string
99
- # @param[String, String, LyberUtils::BagitBag]
100
- def self.export_metadata_string(metadata_string, filename, bag)
101
- bag.add_metadata_file_from_string(metadata_string, filename)
102
- end
103
-
104
- # merge item-specific data into the standard hash of metadata information
105
- # @param [String, String]
106
- def self.metadata_info(druid, agreement_id)
107
- item_info = {
108
- 'External-Identifier' => druid,
109
- 'Stanford-Agreement-ID' => agreement_id
110
- }
111
- merged_info = item_info.merge(METADATA_INFO)
112
- return merged_info
113
- end
114
-
115
- end
116
-
117
- end