dor-services 4.22.3 → 4.22.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/bin/dor-indexer +19 -20
- data/bin/dor-indexerd +2 -3
- data/config/certs/robots-dor-dev.crt +29 -0
- data/config/certs/robots-dor-dev.key +27 -0
- data/config/dev_console_env.rb +77 -0
- data/lib/dor-services.rb +3 -3
- data/lib/dor/config.rb +15 -15
- data/lib/dor/datastreams/administrative_metadata_ds.rb +5 -5
- data/lib/dor/datastreams/content_metadata_ds.rb +181 -225
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
- data/lib/dor/datastreams/default_object_rights_ds.rb +8 -10
- data/lib/dor/datastreams/desc_metadata_ds.rb +35 -34
- data/lib/dor/datastreams/embargo_metadata_ds.rb +7 -7
- data/lib/dor/datastreams/events_ds.rb +11 -11
- data/lib/dor/datastreams/geo_metadata_ds.rb +86 -86
- data/lib/dor/datastreams/identity_metadata_ds.rb +19 -19
- data/lib/dor/datastreams/role_metadata_ds.rb +3 -3
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +13 -13
- data/lib/dor/datastreams/version_metadata_ds.rb +5 -5
- data/lib/dor/datastreams/workflow_definition_ds.rb +21 -21
- data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +1 -1
- data/lib/dor/migrations/identifiable/fix_model_assertions.rb +1 -1
- data/lib/dor/migrations/identifiable/record_remediation.rb +2 -2
- data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +1 -1
- data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +1 -1
- data/lib/dor/migrations/processable/unify_workflows.rb +4 -4
- data/lib/dor/migrations/versionable/add_missing_version_md.rb +1 -1
- data/lib/dor/models/admin_policy_object.rb +1 -1
- data/lib/dor/models/assembleable.rb +5 -5
- data/lib/dor/models/contentable.rb +27 -27
- data/lib/dor/models/describable.rb +168 -179
- data/lib/dor/models/discoverable.rb +13 -13
- data/lib/dor/models/editable.rb +55 -55
- data/lib/dor/models/embargoable.rb +26 -26
- data/lib/dor/models/eventable.rb +3 -3
- data/lib/dor/models/geoable.rb +8 -8
- data/lib/dor/models/governable.rb +14 -14
- data/lib/dor/models/identifiable.rb +117 -143
- data/lib/dor/models/item.rb +2 -2
- data/lib/dor/models/itemizable.rb +9 -9
- data/lib/dor/models/presentable.rb +8 -8
- data/lib/dor/models/preservable.rb +4 -4
- data/lib/dor/models/processable.rb +22 -23
- data/lib/dor/models/releaseable.rb +26 -26
- data/lib/dor/models/shelvable.rb +14 -14
- data/lib/dor/models/upgradable.rb +13 -13
- data/lib/dor/models/versionable.rb +2 -2
- data/lib/dor/models/workflow_object.rb +4 -4
- data/lib/dor/services/cleanup_reset_service.rb +27 -27
- data/lib/dor/services/cleanup_service.rb +4 -7
- data/lib/dor/services/digital_stacks_service.rb +10 -10
- data/lib/dor/services/merge_service.rb +1 -1
- data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +2 -2
- data/lib/dor/services/metadata_service.rb +20 -20
- data/lib/dor/services/registration_service.rb +27 -27
- data/lib/dor/services/reset_workspace_service.rb +15 -15
- data/lib/dor/services/sdr_ingest_service.rb +6 -6
- data/lib/dor/services/search_service.rb +2 -2
- data/lib/dor/services/suri_service.rb +5 -5
- data/lib/dor/services/technical_metadata_service.rb +2 -3
- data/lib/dor/utils/ng_tidy.rb +9 -9
- data/lib/dor/utils/predicate_patch.rb +1 -1
- data/lib/dor/utils/solr_doc_helper.rb +2 -2
- data/lib/dor/version.rb +1 -1
- data/lib/dor/workflow/document.rb +19 -19
- data/lib/dor/workflow/graph.rb +36 -36
- data/lib/dor/workflow/process.rb +12 -12
- data/lib/tasks/dor.rake +1 -1
- data/lib/tasks/rdoc.rake +3 -3
- metadata +6 -3
@@ -63,7 +63,7 @@ module Dor
|
|
63
63
|
# @option opts [Boolean] :start_accesion set to true if you want accessioning to start (default), false otherwise
|
64
64
|
# @raise [Dor::Exception] if the object hasn't been opened for versioning, or if accessionWF has
|
65
65
|
# already been instantiated or the current version is missing a tag or description
|
66
|
-
def close_version(opts={})
|
66
|
+
def close_version(opts = {})
|
67
67
|
unless(opts.empty?)
|
68
68
|
datastreams['versionMetadata'].update_current_version opts
|
69
69
|
datastreams['versionMetadata'].save
|
@@ -84,7 +84,7 @@ module Dor
|
|
84
84
|
|
85
85
|
# @return [Boolean] true if the object is in a state that allows it to be modified. States that will allow modification are: has not been submitted for accessioning, has an open version or has sdr-ingest set to hold
|
86
86
|
def allows_modification?
|
87
|
-
if Dor::WorkflowService.get_lifecycle('dor', pid, 'submitted' )
|
87
|
+
if Dor::WorkflowService.get_lifecycle('dor', pid, 'submitted' ) && !new_version_open? && Dor::WorkflowService.get_workflow_status('dor', pid, 'accessionWF', 'sdr-ingest-transfer') != 'hold'
|
88
88
|
false
|
89
89
|
else
|
90
90
|
true
|
@@ -12,7 +12,7 @@ module Dor
|
|
12
12
|
has_metadata :name => "workflowDefinition", :type => Dor::WorkflowDefinitionDs, :label => 'Workflow Definition'
|
13
13
|
|
14
14
|
def self.find_by_name(name, opts = {})
|
15
|
-
Dor.find_all(%{objectType_t:"#{
|
15
|
+
Dor.find_all(%{objectType_t:"#{object_type}" workflow_name_s:"#{name}"}, opts).first
|
16
16
|
end
|
17
17
|
|
18
18
|
# Searches for the workflow definition object in DOR, then
|
@@ -22,7 +22,7 @@ module Dor
|
|
22
22
|
# @return [String] the initial workflow xml
|
23
23
|
def self.initial_workflow(name)
|
24
24
|
return @@xml_cache[name] if @@xml_cache.include?(name)
|
25
|
-
|
25
|
+
find_and_cache_workflow_xml_and_repo name
|
26
26
|
@@xml_cache[name]
|
27
27
|
end
|
28
28
|
|
@@ -32,7 +32,7 @@ module Dor
|
|
32
32
|
# @return [String] the initial workflow xml
|
33
33
|
def self.initial_repo(name)
|
34
34
|
return @@repo_cache[name] if @@repo_cache.include?(name)
|
35
|
-
|
35
|
+
find_and_cache_workflow_xml_and_repo name
|
36
36
|
@@repo_cache[name]
|
37
37
|
end
|
38
38
|
|
@@ -41,7 +41,7 @@ module Dor
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def graph(*args)
|
44
|
-
|
44
|
+
definition.graph *args
|
45
45
|
end
|
46
46
|
|
47
47
|
def to_solr(solr_doc = {}, *args)
|
@@ -4,27 +4,27 @@ module Dor
|
|
4
4
|
|
5
5
|
# Remove all traces of the object's data files from the workspace and export areas
|
6
6
|
class CleanupResetService
|
7
|
-
|
7
|
+
|
8
8
|
# @param [String] druid The identifier for the object whose reset data is to be removed
|
9
9
|
# @return [void] remove copy of the reset data that was exported to preservation core
|
10
10
|
def self.cleanup_by_reset_druid(druid)
|
11
|
-
last_version = get_druid_last_version(druid)
|
11
|
+
last_version = get_druid_last_version(druid)
|
12
12
|
cleanup_reset_workspace_content(druid, last_version, Config.cleanup.local_workspace_root)
|
13
13
|
cleanup_assembly_content(druid, Config.cleanup.local_assembly_root)
|
14
14
|
cleanup_reset_export(druid, last_version)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def self.get_druid_last_version(druid)
|
18
18
|
druid_obj = Dor::Item.find(druid)
|
19
19
|
last_version = druid_obj.current_version.to_i
|
20
|
-
|
20
|
+
|
21
21
|
#if the current version is still open, avoid this versioned directory
|
22
|
-
if Dor::WorkflowService.get_lifecycle('dor', druid, 'accessioned').nil? then
|
23
|
-
last_version
|
22
|
+
if Dor::WorkflowService.get_lifecycle('dor', druid, 'accessioned').nil? then
|
23
|
+
last_version -= 1
|
24
24
|
end
|
25
|
-
|
25
|
+
last_version
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# @param [String] druid The identifier for the object whose reset data is to be removed
|
29
29
|
# @param [String] base The base directory to delete from
|
30
30
|
# @param [Integer] last_version The last version that the data should be removed until version 1
|
@@ -32,28 +32,28 @@ module Dor
|
|
32
32
|
def self.cleanup_reset_workspace_content(druid,last_version, base)
|
33
33
|
base_druid = DruidTools::Druid.new(druid, base)
|
34
34
|
base_druid_tree = base_druid.pathname.to_s
|
35
|
-
#if it is truncated tree /aa/111/aaa/1111/content,
|
35
|
+
#if it is truncated tree /aa/111/aaa/1111/content,
|
36
36
|
#we should follow the regular cleanup technique
|
37
37
|
|
38
38
|
reset_directories = get_reset_dir_list(last_version, base_druid_tree)
|
39
|
-
reset_directories.each do |path|
|
39
|
+
reset_directories.each do |path|
|
40
40
|
FileUtils.rm_rf(path)
|
41
41
|
end
|
42
42
|
base_druid.prune_ancestors(base_druid.pathname.parent)
|
43
43
|
end
|
44
|
-
|
45
|
-
|
44
|
+
|
45
|
+
|
46
46
|
# @param [String] druid The identifier for the object whose reset data is to be removed
|
47
47
|
# @param [String] base The base directory to delete from
|
48
48
|
# @param [Integer] last_version The last version that the data should be removed until version 1
|
49
49
|
# @return [void] prepares a list of reset directories that should be removed
|
50
50
|
def self.get_reset_dir_list(last_version, base_druid_tree)
|
51
|
-
reset_directories = []
|
52
|
-
for i in 1..last_version
|
51
|
+
reset_directories = []
|
52
|
+
for i in 1..last_version
|
53
53
|
reset_path = "#{base_druid_tree}_v#{i}"
|
54
|
-
reset_directories.append(reset_path) if File.exists?(reset_path)
|
54
|
+
reset_directories.append(reset_path) if File.exists?(reset_path)
|
55
55
|
end
|
56
|
-
|
56
|
+
reset_directories
|
57
57
|
end
|
58
58
|
|
59
59
|
# @param [String] druid The identifier for the object whose reset bags data is to be removed
|
@@ -61,40 +61,40 @@ module Dor
|
|
61
61
|
def self.cleanup_reset_export(druid, last_version)
|
62
62
|
id = druid.split(':').last
|
63
63
|
base_bag_directory = File.join(Config.cleanup.local_export_home, id)
|
64
|
-
|
64
|
+
|
65
65
|
bag_dir_list = get_reset_bag_dir_list(last_version, base_bag_directory)
|
66
|
-
bag_dir_list.each do |bag_dir|
|
66
|
+
bag_dir_list.each do |bag_dir|
|
67
67
|
Pathname(bag_dir).rmtree
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
bag_tar_list = get_reset_bag_tar_list(last_version, base_bag_directory)
|
71
|
-
bag_tar_list.each do |bag_tar|
|
71
|
+
bag_tar_list.each do |bag_tar|
|
72
72
|
Pathname(bag_tar).rmtree
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
# @param [Integer] last_version The last version that the data should be removed until version 1
|
77
77
|
# @param [String] base_bag_directory The base bag directory including the export home and druid id
|
78
78
|
# @return [void] prepares a list of reset bag directories that should be removed
|
79
79
|
def self.get_reset_bag_dir_list(last_version, base_bag_directory)
|
80
|
-
reset_bags = []
|
80
|
+
reset_bags = []
|
81
81
|
for i in 1..last_version do
|
82
82
|
reset_path = "#{base_bag_directory}_v#{i}"
|
83
|
-
reset_bags.append(reset_path) if File.exists?(reset_path)
|
83
|
+
reset_bags.append(reset_path) if File.exists?(reset_path)
|
84
84
|
end
|
85
|
-
|
85
|
+
reset_bags
|
86
86
|
end
|
87
87
|
|
88
88
|
# @param [String] base_bag_directory The base bag directory including the export home and druid id
|
89
89
|
# @param [Integer] last_version The last version that the data should be removed until version 1
|
90
90
|
# @return [void] prepares a list of reset bag tars that should be removed
|
91
91
|
def self.get_reset_bag_tar_list(last_version, base_bag_directory)
|
92
|
-
reset_bags = []
|
92
|
+
reset_bags = []
|
93
93
|
for i in 1..last_version do
|
94
94
|
reset_path = "#{base_bag_directory}_v#{i}.tar"
|
95
|
-
reset_bags.append(reset_path) if File.exists?(reset_path)
|
95
|
+
reset_bags.append(reset_path) if File.exists?(reset_path)
|
96
96
|
end
|
97
|
-
|
97
|
+
reset_bags
|
98
98
|
end
|
99
99
|
|
100
100
|
# @param [String] druid The identifier for the object whose data is to be removed
|
@@ -24,15 +24,15 @@ module Dor
|
|
24
24
|
def self.cleanup_workspace_content(druid, base)
|
25
25
|
DruidTools::Druid.new(druid, base).prune!
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# @param [String] druid The identifier for the object whose data is to be removed
|
29
29
|
# @return [void] remove copy of the data that was exported to preservation core
|
30
30
|
def self.cleanup_export(druid)
|
31
31
|
id = druid.split(':').last
|
32
32
|
bag_dir = File.join(Config.cleanup.local_export_home, id)
|
33
|
-
|
33
|
+
remove_branch(bag_dir)
|
34
34
|
tarfile = "#{bag_dir}.tar"
|
35
|
-
|
35
|
+
remove_branch(tarfile)
|
36
36
|
end
|
37
37
|
|
38
38
|
# @param [Pathname,String] pathname The full path of the branch to be removed
|
@@ -83,9 +83,6 @@ module Dor
|
|
83
83
|
Dor::SearchService.solr.delete_by_id(pid)
|
84
84
|
Dor::SearchService.solr.commit
|
85
85
|
end
|
86
|
-
end
|
86
|
+
end
|
87
87
|
|
88
88
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
@@ -14,7 +14,7 @@ module Dor
|
|
14
14
|
subset.files.each do |moab_file| # {Moab::FileInstanceDifference}
|
15
15
|
moab_signature = moab_file.signatures.first # {Moab::FileSignature}
|
16
16
|
file_pathname = stacks_object_pathname.join(moab_file.basis_path)
|
17
|
-
|
17
|
+
delete_file(file_pathname, moab_signature)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -24,14 +24,14 @@ module Dor
|
|
24
24
|
# @param [Moab::FileSignature] moab_signature The fixity values of the file
|
25
25
|
# @return [Boolean] true if file deleted, false otherwise
|
26
26
|
def self.delete_file(file_pathname, moab_signature)
|
27
|
-
if file_pathname.exist?
|
27
|
+
if file_pathname.exist? && (file_pathname.size == moab_signature.size)
|
28
28
|
file_signature = Moab::FileSignature.new.signature_from_file(file_pathname)
|
29
29
|
if (file_signature == moab_signature)
|
30
30
|
file_pathname.delete
|
31
31
|
return true
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
false
|
35
35
|
end
|
36
36
|
|
37
37
|
# Rename files from stacks that have change type 'renamed' using an intermediate temp filename.
|
@@ -46,7 +46,7 @@ module Dor
|
|
46
46
|
moab_signature = moab_file.signatures.first # {Moab::FileSignature}
|
47
47
|
original_pathname = stacks_object_pathname.join(moab_file.basis_path)
|
48
48
|
temp_pathname = stacks_object_pathname.join(moab_signature.checksums.values.last)
|
49
|
-
|
49
|
+
rename_file(original_pathname, temp_pathname, moab_signature)
|
50
50
|
end
|
51
51
|
|
52
52
|
# 2nd Pass - rename files from checksum-based name to new name
|
@@ -54,7 +54,7 @@ module Dor
|
|
54
54
|
moab_signature = moab_file.signatures.first # {Moab::FileSignature}
|
55
55
|
temp_pathname = stacks_object_pathname.join(moab_signature.checksums.values.last)
|
56
56
|
new_pathname = stacks_object_pathname.join(moab_file.other_path)
|
57
|
-
|
57
|
+
rename_file(temp_pathname, new_pathname, moab_signature)
|
58
58
|
end
|
59
59
|
|
60
60
|
end
|
@@ -65,7 +65,7 @@ module Dor
|
|
65
65
|
# @param [Moab::FileSignature] moab_signature The fixity values of the file
|
66
66
|
# @return [Boolean] true if file renamed, false otherwise
|
67
67
|
def self.rename_file(old_pathname, new_pathname, moab_signature)
|
68
|
-
if old_pathname.exist?
|
68
|
+
if old_pathname.exist? && (old_pathname.size == moab_signature.size)
|
69
69
|
file_signature = Moab::FileSignature.new.signature_from_file(old_pathname)
|
70
70
|
if (file_signature == moab_signature)
|
71
71
|
new_pathname.parent.mkpath
|
@@ -73,7 +73,7 @@ module Dor
|
|
73
73
|
return true
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
false
|
77
77
|
end
|
78
78
|
|
79
79
|
# Add files to stacks that have change type 'added', 'copyadded' or 'modified'.
|
@@ -82,14 +82,14 @@ module Dor
|
|
82
82
|
# @param [Moab::FileGroupDifference] content_diff the content file version differences report
|
83
83
|
def self.shelve_to_stacks(workspace_content_pathname, stacks_object_pathname, content_diff)
|
84
84
|
return false if workspace_content_pathname.nil?
|
85
|
-
[:added, :copyadded, :modified
|
85
|
+
[:added, :copyadded, :modified].each do |change_type|
|
86
86
|
subset = content_diff.subset(change_type) # {Moab::FileGroupDifferenceSubset
|
87
87
|
subset.files.each do |moab_file| # {Moab::FileInstanceDifference}
|
88
88
|
moab_signature = moab_file.signatures.last # {Moab::FileSignature}
|
89
89
|
filename = (change_type == :modified) ? moab_file.basis_path : moab_file.other_path
|
90
90
|
workspace_pathname = workspace_content_pathname.join(filename)
|
91
91
|
stacks_pathname = stacks_object_pathname.join(filename)
|
92
|
-
|
92
|
+
copy_file(workspace_pathname, stacks_pathname, moab_signature)
|
93
93
|
end
|
94
94
|
end
|
95
95
|
true
|
@@ -110,7 +110,7 @@ module Dor
|
|
110
110
|
FileUtils.cp workspace_pathname.to_s, stacks_pathname.to_s
|
111
111
|
return true
|
112
112
|
end
|
113
|
-
|
113
|
+
false
|
114
114
|
end
|
115
115
|
|
116
116
|
### depricated ???
|
@@ -27,7 +27,7 @@ module Dor
|
|
27
27
|
unless @primary.allows_modification?
|
28
28
|
raise Dor::Exception.new "Primary object is not editable: #{@primary.pid}"
|
29
29
|
end
|
30
|
-
if ( non_editable = (@secondary_objs.detect {|obj| !
|
30
|
+
if ( non_editable = (@secondary_objs.detect {|obj| !obj.allows_modification? } ))
|
31
31
|
raise Dor::Exception.new "Secondary object is not editable: #{non_editable.pid}"
|
32
32
|
end
|
33
33
|
end
|
@@ -26,7 +26,7 @@ handler = Class.new do
|
|
26
26
|
end
|
27
27
|
case xml.root.name
|
28
28
|
when 'msDesc' then xml.xpath('/msDesc/msIdentifier/collection').text
|
29
|
-
when 'mods' then
|
29
|
+
when 'mods' then
|
30
30
|
xml.root.add_namespace_definition('mods','http://www.loc.gov/mods/v3')
|
31
31
|
xml.xpath('/mods:mods/mods:titleInfo[1]').xpath('mods:title|mods:nonSort').collect { |n| n.text }.join(' ').strip
|
32
32
|
end
|
@@ -37,4 +37,4 @@ handler = Class.new do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
Dor::MetadataService.register(handler)
|
40
|
+
Dor::MetadataService.register(handler)
|
@@ -3,27 +3,27 @@ require 'cache'
|
|
3
3
|
module Dor
|
4
4
|
|
5
5
|
class MetadataError < Exception ; end
|
6
|
-
|
6
|
+
|
7
7
|
# class MetadataHandler
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# def fetch(prefix, identifier)
|
10
10
|
# ### Return metadata for prefix/identifier combo
|
11
11
|
# end
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# def label(metadata)
|
14
14
|
# ### Return a Fedora-compatible label from the metadata format returned by #fetch
|
15
15
|
# end
|
16
|
-
#
|
16
|
+
#
|
17
17
|
# end
|
18
|
-
|
18
|
+
|
19
19
|
class MetadataService
|
20
|
-
|
20
|
+
|
21
21
|
class << self
|
22
22
|
@@cache = Cache.new(nil, nil, 250, 300)
|
23
|
-
|
23
|
+
|
24
24
|
def register(handler_class)
|
25
25
|
['fetch', 'label', 'prefixes'].each do |method|
|
26
|
-
unless handler_class.instance_methods.include?(method) or handler_class.instance_methods.include?(method.to_sym)
|
26
|
+
unless handler_class.instance_methods.include?(method) or handler_class.instance_methods.include?(method.to_sym)
|
27
27
|
raise TypeError, "Metadata handlers must define ##{method.to_s}"
|
28
28
|
end
|
29
29
|
end
|
@@ -31,23 +31,23 @@ module Dor
|
|
31
31
|
handler.prefixes.each do |prefix|
|
32
32
|
handlers[prefix.to_sym] = handler
|
33
33
|
end
|
34
|
-
|
34
|
+
handler
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def known_prefixes
|
38
|
-
|
38
|
+
handlers.keys
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def can_resolve?(identifier)
|
42
42
|
(prefix, identifier) = identifier.split(/:/,2)
|
43
43
|
handlers.keys.include?(prefix.to_sym)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# TODO: Return a prioritized list
|
47
47
|
def resolvable(identifiers)
|
48
48
|
identifiers.select { |identifier| self.can_resolve?(identifier) }
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
def fetch(identifier)
|
52
52
|
@@cache.fetch(identifier) do
|
53
53
|
(prefix, identifier) = identifier.split(/:/,2)
|
@@ -61,24 +61,24 @@ module Dor
|
|
61
61
|
handler = handler_for(prefix)
|
62
62
|
handler.label(handler.fetch(prefix, identifier))
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
def handler_for(prefix)
|
66
66
|
handler = handlers[prefix.to_sym]
|
67
67
|
if handler.nil?
|
68
68
|
raise MetadataError, "Unkown metadata prefix: #{prefix}"
|
69
69
|
end
|
70
|
-
|
70
|
+
handler
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
private
|
74
74
|
def handlers
|
75
75
|
@handlers ||= {}
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
end
|
83
83
|
|
84
84
|
Dir[File.join(File.dirname(__FILE__),'metadata_handlers','*.rb')].each { |handler_file|
|
@@ -1,23 +1,23 @@
|
|
1
1
|
require 'uuidtools'
|
2
2
|
|
3
3
|
module Dor
|
4
|
-
|
4
|
+
|
5
5
|
class RegistrationService
|
6
|
-
|
6
|
+
|
7
7
|
class << self
|
8
8
|
def register_object(params = {})
|
9
9
|
Dor.ensure_models_loaded!
|
10
10
|
[:object_type, :label].each do |required_param|
|
11
|
-
raise Dor::ParameterError, "#{required_param.inspect} must be specified in call to #{
|
11
|
+
raise Dor::ParameterError, "#{required_param.inspect} must be specified in call to #{name}.register_object" unless params[required_param]
|
12
12
|
end
|
13
13
|
metadata_source=params[:metadata_source]
|
14
|
-
if params[:label].length<1
|
15
|
-
raise Dor::ParameterError, "label cannot be empty to call #{
|
14
|
+
if params[:label].length<1 && (metadata_source=='label' || metadata_source=='none')
|
15
|
+
raise Dor::ParameterError, "label cannot be empty to call #{name}.register_object"
|
16
16
|
end
|
17
|
-
object_type = params[:object_type]
|
17
|
+
object_type = params[:object_type]
|
18
18
|
item_class = Dor.registered_classes[object_type]
|
19
19
|
raise Dor::ParameterError, "Unknown item type: '#{object_type}'" if item_class.nil?
|
20
|
-
|
20
|
+
|
21
21
|
content_model = params[:content_model]
|
22
22
|
admin_policy = params[:admin_policy]
|
23
23
|
label = params[:label]
|
@@ -37,12 +37,12 @@ module Dor
|
|
37
37
|
else
|
38
38
|
pid = Dor::SuriService.mint_id
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
rights=nil
|
42
42
|
if params[:rights]
|
43
43
|
rights=params[:rights]
|
44
|
-
|
45
|
-
raise Dor::ParameterError,"Unknown rights setting" + rights + "when calling #{
|
44
|
+
unless ['world','stanford','dark','default','none'].include? rights
|
45
|
+
raise Dor::ParameterError,"Unknown rights setting" + rights + "when calling #{name}.register_object"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -54,17 +54,17 @@ module Dor
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
if (other_ids.has_key?(:uuid)
|
57
|
+
if (other_ids.has_key?(:uuid) || other_ids.has_key?('uuid')) == false
|
58
58
|
other_ids[:uuid] = UUIDTools::UUID.timestamp_create.to_s
|
59
59
|
end
|
60
60
|
short_label=label
|
61
61
|
if label.length>254
|
62
62
|
short_label=label[0,254]
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
apo_object = Dor.find(admin_policy, :lightweight => true)
|
66
66
|
adm_xml = apo_object.administrativeMetadata.ng_xml
|
67
|
-
|
67
|
+
|
68
68
|
new_item = item_class.new(:pid => pid)
|
69
69
|
new_item.label = short_label
|
70
70
|
idmd = new_item.identityMetadata
|
@@ -76,7 +76,7 @@ module Dor
|
|
76
76
|
other_ids.each_pair { |name,value| idmd.add_otherId("#{name}:#{value}") }
|
77
77
|
tags.each { |tag| idmd.add_value(:tag, tag) }
|
78
78
|
new_item.admin_policy_object = apo_object
|
79
|
-
|
79
|
+
|
80
80
|
adm_xml.xpath('/administrativeMetadata/relationships/*').each do |rel|
|
81
81
|
short_predicate = ActiveFedora::RelsExtDatastream.short_predicate rel.namespace.href+rel.name
|
82
82
|
if short_predicate.nil?
|
@@ -89,7 +89,7 @@ module Dor
|
|
89
89
|
if collection
|
90
90
|
new_item.add_collection(collection)
|
91
91
|
end
|
92
|
-
if(rights
|
92
|
+
if(rights && ['item','collection'].include?(object_type) )
|
93
93
|
rights_xml=apo_object.defaultObjectRights.ng_xml
|
94
94
|
new_item.datastreams['rightsMetadata'].content=rights_xml.to_s
|
95
95
|
new_item.set_read_rights(rights)
|
@@ -104,13 +104,13 @@ module Dor
|
|
104
104
|
}
|
105
105
|
}
|
106
106
|
}
|
107
|
-
|
107
|
+
|
108
108
|
ds.content=builder.to_xml
|
109
|
-
|
109
|
+
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
workflow_priority = params[:workflow_priority] ? params[:workflow_priority].to_i : 0
|
113
|
-
|
113
|
+
|
114
114
|
Array(params[:seed_datastream]).each { |datastream_name| new_item.build_datastream(datastream_name) }
|
115
115
|
Array(params[:initiate_workflow]).each { |workflow_id| new_item.initialize_workflow(workflow_id, !new_item.new_object?, workflow_priority)}
|
116
116
|
|
@@ -121,9 +121,9 @@ module Dor
|
|
121
121
|
rescue StandardError => e
|
122
122
|
Dor.logger.warn "Dor::RegistrationService.register_object failed to update solr index for #{new_item.pid}: #<#{e.class.name}: #{e.message}>"
|
123
123
|
end
|
124
|
-
|
124
|
+
(new_item)
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
def create_from_request(params)
|
128
128
|
other_ids = Array(params[:other_id]).collect do |id|
|
129
129
|
if id =~ /^symphony:(.+)$/
|
@@ -132,14 +132,14 @@ module Dor
|
|
132
132
|
id
|
133
133
|
end
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
if params[:label] == ':auto'
|
137
137
|
params.delete(:label)
|
138
138
|
params.delete('label')
|
139
139
|
metadata_id = Dor::MetadataService.resolvable(other_ids).first
|
140
140
|
params[:label] = Dor::MetadataService.label_for(metadata_id)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
dor_params = {
|
144
144
|
:pid => params[:pid],
|
145
145
|
:admin_policy => params[:admin_policy],
|
@@ -158,13 +158,13 @@ module Dor
|
|
158
158
|
:workflow_priority => params[:workflow_priority]
|
159
159
|
}
|
160
160
|
dor_params.delete_if { |k,v| v.nil? }
|
161
|
-
|
162
|
-
dor_obj =
|
161
|
+
|
162
|
+
dor_obj = register_object(dor_params)
|
163
163
|
pid = dor_obj.pid
|
164
164
|
location = URI.parse(Dor::Config.fedora.safeurl.sub(/\/*$/,'/')).merge("objects/#{pid}").to_s
|
165
165
|
reg_response = dor_params.dup.merge({ :location => location, :pid => pid })
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
private
|
169
169
|
def ids_to_hash(ids)
|
170
170
|
if ids.nil?
|
@@ -174,7 +174,7 @@ module Dor
|
|
174
174
|
end
|
175
175
|
end
|
176
176
|
end
|
177
|
-
|
177
|
+
|
178
178
|
end
|
179
179
|
|
180
180
|
end
|