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.
- checksums.yaml +15 -0
- data/bin/dor-indexer +108 -0
- data/bin/dor-indexerd +73 -0
- data/bin/nokogiri +19 -0
- data/bin/rake +19 -0
- data/bin/ruby_noexec_wrapper +14 -0
- data/bin/solrizer +19 -0
- data/bin/solrizerd +19 -0
- data/config/certs/README +1 -0
- data/config/config_defaults.yml +62 -0
- data/config/dev_console_env.rb.example +67 -0
- data/config/predicate_mappings.yml +55 -0
- data/lib/dor-services.rb +152 -19
- data/lib/dor/config.rb +133 -35
- data/lib/dor/datastreams/administrative_metadata_ds.rb +84 -0
- data/lib/dor/datastreams/content_metadata_ds.rb +337 -0
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +18 -0
- data/lib/dor/datastreams/default_object_rights_ds.rb +52 -0
- data/lib/dor/datastreams/desc_metadata_ds.rb +39 -0
- data/lib/{datastreams → dor/datastreams}/embargo_metadata_ds.rb +25 -20
- data/lib/{datastreams → dor/datastreams}/events_ds.rb +14 -9
- data/lib/dor/datastreams/identity.xsl +8 -0
- data/lib/dor/datastreams/identity_metadata_ds.rb +112 -0
- data/lib/dor/datastreams/role_metadata_ds.rb +51 -0
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -0
- data/lib/dor/datastreams/version_metadata_ds.rb +214 -0
- data/lib/dor/datastreams/workflow_definition_ds.rb +113 -0
- data/lib/dor/datastreams/workflow_ds.rb +103 -0
- data/lib/dor/exceptions.rb +0 -1
- data/lib/dor/migrations/content_metadata_ds/change_content_type.rb +7 -0
- data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +9 -0
- data/lib/dor/migrations/identifiable/fix_model_assertions.rb +13 -0
- data/lib/dor/migrations/identifiable/record_remediation.rb +18 -0
- data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +18 -0
- data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +18 -0
- data/lib/dor/migrations/processable/unify_workflows.rb +17 -0
- data/lib/dor/migrations/versionable/add_missing_version_md.rb +9 -0
- data/lib/dor/models/admin_policy_object.rb +16 -0
- data/lib/dor/models/assembleable.rb +14 -0
- data/lib/dor/models/collection.rb +14 -0
- data/lib/dor/models/contentable.rb +227 -0
- data/lib/dor/models/describable.rb +194 -0
- data/lib/dor/models/discoverable.rb +66 -0
- data/lib/dor/models/editable.rb +267 -0
- data/lib/dor/models/embargoable.rb +97 -0
- data/lib/dor/models/eventable.rb +12 -0
- data/lib/dor/models/governable.rb +162 -0
- data/lib/dor/models/identifiable.rb +211 -0
- data/lib/dor/models/item.rb +44 -0
- data/lib/dor/models/itemizable.rb +66 -0
- data/lib/dor/{mods2dc.xslt → models/mods2dc.xslt} +39 -12
- data/lib/dor/models/preservable.rb +50 -0
- data/lib/dor/models/processable.rb +229 -0
- data/lib/dor/models/publishable.rb +74 -0
- data/lib/dor/models/set.rb +12 -0
- data/lib/dor/models/shelvable.rb +27 -0
- data/lib/dor/models/upgradable.rb +74 -0
- data/lib/dor/models/versionable.rb +94 -0
- data/lib/dor/models/workflow_object.rb +54 -0
- data/lib/dor/services/cleanup_service.rb +47 -0
- data/lib/dor/services/digital_stacks_service.rb +55 -0
- data/lib/dor/services/merge_service.rb +96 -0
- data/lib/dor/{metadata_handlers → services/metadata_handlers}/catalog_handler.rb +0 -2
- data/lib/dor/{metadata_handlers → services/metadata_handlers}/mdtoolkit_handler.rb +0 -2
- data/lib/dor/{metadata_service.rb → services/metadata_service.rb} +1 -3
- data/lib/dor/services/registration_service.rb +181 -0
- data/lib/dor/services/sdr_ingest_service.rb +181 -0
- data/lib/dor/services/search_service.rb +131 -0
- data/lib/dor/services/suri_service.rb +32 -0
- data/lib/dor/services/technical_metadata_service.rb +226 -0
- data/lib/dor/{tei2dc.xslt → services/tei2dc.xslt} +0 -0
- data/lib/dor/utils/ng_tidy.rb +37 -0
- data/lib/dor/utils/predicate_patch.rb +23 -0
- data/lib/dor/utils/solr_doc_helper.rb +9 -0
- data/lib/dor/utils/utc_date_field_mapper.rb +7 -0
- data/lib/dor/version.rb +3 -0
- data/lib/dor/workflow/document.rb +131 -0
- data/lib/dor/workflow/graph.rb +166 -0
- data/lib/dor/workflow/process.rb +99 -0
- data/lib/gsearch/demoFoxmlToSolr.xslt +340 -122
- data/lib/tasks/dor.rake +39 -0
- metadata +494 -384
- data/lib/datastreams/content_metadata_ds.rb +0 -12
- data/lib/datastreams/identity_metadata_ds.rb +0 -28
- data/lib/datastreams/ng_tidy.rb +0 -19
- data/lib/datastreams/simple_dublin_core_ds.rb +0 -23
- data/lib/datastreams/workflow_definition_ds.rb +0 -105
- data/lib/datastreams/workflow_ds.rb +0 -16
- data/lib/dor/admin_policy_object.rb +0 -11
- data/lib/dor/base.rb +0 -81
- data/lib/dor/cleanup_service.rb +0 -32
- data/lib/dor/digital_stacks_service.rb +0 -82
- data/lib/dor/druid_utils.rb +0 -41
- data/lib/dor/embargo.rb +0 -41
- data/lib/dor/item.rb +0 -141
- data/lib/dor/provenance_metadata_service.rb +0 -65
- data/lib/dor/registration_service.rb +0 -87
- data/lib/dor/rsolr.rb +0 -27
- data/lib/dor/sdr_ingest_service.rb +0 -117
- data/lib/dor/search_service.rb +0 -86
- data/lib/dor/suri_service.rb +0 -37
- data/lib/dor/workflow_object.rb +0 -13
- data/lib/dor/workflow_service.rb +0 -111
- data/lib/xml_models/foxml.rb +0 -261
- data/lib/xml_models/identity_metadata/dublin_core.rb +0 -119
- data/lib/xml_models/identity_metadata/identity_metadata.rb +0 -288
data/lib/dor/embargo.rb
DELETED
@@ -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
|
data/lib/dor/item.rb
DELETED
@@ -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
|
data/lib/dor/rsolr.rb
DELETED
@@ -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
|