dor-services 6.0.5 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/dor-services.rb +27 -12
- data/lib/dor/config.rb +45 -42
- data/lib/dor/datastreams/administrative_metadata_ds.rb +137 -44
- data/lib/dor/datastreams/content_metadata_ds.rb +42 -42
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
- data/lib/dor/datastreams/default_object_rights_ds.rb +185 -44
- data/lib/dor/datastreams/desc_metadata_ds.rb +36 -28
- data/lib/dor/datastreams/embargo_metadata_ds.rb +12 -14
- data/lib/dor/datastreams/events_ds.rb +10 -10
- data/lib/dor/datastreams/geo_metadata_ds.rb +4 -5
- data/lib/dor/datastreams/identity_metadata_ds.rb +14 -14
- data/lib/dor/datastreams/rights_metadata_ds.rb +23 -23
- data/lib/dor/datastreams/role_metadata_ds.rb +61 -15
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +8 -8
- data/lib/dor/datastreams/version_metadata_ds.rb +10 -12
- data/lib/dor/datastreams/workflow_definition_ds.rb +6 -6
- data/lib/dor/datastreams/workflow_ds.rb +13 -13
- data/lib/dor/exceptions.rb +2 -2
- data/lib/dor/indexers/data_indexer.rb +1 -7
- data/lib/dor/indexers/describable_indexer.rb +1 -1
- data/lib/dor/indexers/identifiable_indexer.rb +0 -2
- data/lib/dor/indexers/processable_indexer.rb +55 -28
- data/lib/dor/indexers/releasable_indexer.rb +2 -2
- data/lib/dor/models/admin_policy_object.rb +4 -4
- data/lib/dor/models/concerns/assembleable.rb +4 -0
- data/lib/dor/models/concerns/contentable.rb +27 -69
- data/lib/dor/models/concerns/describable.rb +14 -29
- data/lib/dor/models/concerns/editable.rb +20 -334
- data/lib/dor/models/concerns/embargoable.rb +7 -11
- data/lib/dor/models/concerns/eventable.rb +5 -1
- data/lib/dor/models/concerns/geoable.rb +4 -4
- data/lib/dor/models/concerns/governable.rb +18 -87
- data/lib/dor/models/concerns/identifiable.rb +15 -75
- data/lib/dor/models/concerns/itemizable.rb +9 -11
- data/lib/dor/models/concerns/preservable.rb +4 -0
- data/lib/dor/models/concerns/processable.rb +30 -129
- data/lib/dor/models/concerns/publishable.rb +6 -55
- data/lib/dor/models/concerns/releaseable.rb +14 -227
- data/lib/dor/models/concerns/rightsable.rb +3 -3
- data/lib/dor/models/concerns/shelvable.rb +4 -49
- data/lib/dor/models/concerns/versionable.rb +21 -44
- data/lib/dor/models/set.rb +1 -1
- data/lib/dor/models/workflow_object.rb +2 -2
- data/lib/dor/services/ability.rb +77 -0
- data/lib/dor/services/cleanup_reset_service.rb +1 -3
- data/lib/dor/services/create_workflow_service.rb +51 -0
- data/lib/dor/services/creative_commons_license_service.rb +31 -0
- data/lib/dor/services/datastream_builder.rb +90 -0
- data/lib/dor/services/digital_stacks_service.rb +3 -21
- data/lib/dor/services/dublin_core_service.rb +40 -0
- data/lib/dor/services/file_metadata_merge_service.rb +67 -0
- data/lib/dor/services/indexing_service.rb +8 -4
- data/lib/dor/services/merge_service.rb +5 -5
- data/lib/dor/services/metadata_handlers/catalog_handler.rb +1 -1
- data/lib/dor/services/metadata_service.rb +6 -8
- data/lib/dor/{models/concerns → services}/mods2dc.xslt +0 -0
- data/lib/dor/services/ontology.rb +35 -0
- data/lib/dor/services/open_data_license_service.rb +20 -0
- data/lib/dor/services/public_desc_metadata_service.rb +21 -14
- data/lib/dor/services/public_xml_service.rb +6 -6
- data/lib/dor/services/publish_metadata_service.rb +100 -0
- data/lib/dor/services/registration_service.rb +43 -46
- data/lib/dor/services/release_tag_service.rb +251 -0
- data/lib/dor/services/reset_workspace_service.rb +1 -3
- data/lib/dor/services/sdr_ingest_service.rb +5 -7
- data/lib/dor/services/search_service.rb +10 -10
- data/lib/dor/services/secondary_file_name_service.rb +10 -0
- data/lib/dor/services/shelving_service.rb +67 -0
- data/lib/dor/services/status_service.rb +121 -0
- data/lib/dor/services/suri_service.rb +3 -5
- data/lib/dor/services/tag_service.rb +100 -0
- data/lib/dor/services/technical_metadata_service.rb +5 -4
- data/lib/dor/services/version_service.rb +84 -0
- data/lib/dor/utils/ng_tidy.rb +1 -1
- data/lib/dor/utils/sdr_client.rb +25 -9
- data/lib/dor/version.rb +1 -1
- data/lib/dor/workflow/document.rb +13 -13
- data/lib/dor/workflow/process.rb +71 -26
- data/lib/tasks/rdoc.rake +1 -1
- metadata +77 -51
- data/config/certs/robots-dor-dev.crt +0 -29
- data/config/certs/robots-dor-dev.key +0 -27
- data/config/dev_console_env.rb +0 -80
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 26a4905c3d1c7ff07df99e6b7de0ec136d87cb847c30e1e676332f2142fafeac
|
|
4
|
+
data.tar.gz: 476d89693752ff2e17aa58d5efb9e559abc79a610da4c6ea413755df64c57009
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 96957b78cb9f2e13efd0a82f3d20cc19dc9f544243bed791fe9c86cee69a179b88c1386511eaf4a1ac159d15868ecae40ffb1753847359b7b116d69fa7588fa8
|
|
7
|
+
data.tar.gz: f27dd546d898ebae9bae95ef3180296cc434b6fdd8a06e293d92bc8ba6db5fa327758a34f895d21b63f817504ceffc161bc065f6ee86e319d30d75adcbbe4d7d
|
data/lib/dor-services.rb
CHANGED
|
@@ -30,7 +30,7 @@ module Dor
|
|
|
30
30
|
# Dor.load_instance() if the item is not in the index, or is improperly indexed.
|
|
31
31
|
# @param [String] pid The object's PID
|
|
32
32
|
# @return [Object] the ActiveFedora-modeled object
|
|
33
|
-
def find(pid,
|
|
33
|
+
def find(pid, _opts = {})
|
|
34
34
|
load_instance(pid)
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -149,23 +149,38 @@ module Dor
|
|
|
149
149
|
|
|
150
150
|
# Services
|
|
151
151
|
autoload_under 'services' do
|
|
152
|
-
autoload :
|
|
152
|
+
autoload :Ability
|
|
153
|
+
autoload :CleanupResetService
|
|
154
|
+
autoload :CleanupService
|
|
155
|
+
autoload :CreateWorkflowService
|
|
156
|
+
autoload :CreativeCommonsLicenseService
|
|
157
|
+
autoload :DatastreamBuilder
|
|
158
|
+
autoload :DigitalStacksService
|
|
159
|
+
autoload :DublinCoreService
|
|
160
|
+
autoload :FileMetadataMergeService
|
|
153
161
|
autoload :IndexingService
|
|
154
162
|
autoload :MetadataService
|
|
155
|
-
autoload :RegistrationService
|
|
156
|
-
autoload :SuriService
|
|
157
|
-
autoload :WorkflowService
|
|
158
|
-
autoload :DigitalStacksService
|
|
159
|
-
autoload :SdrIngestService
|
|
160
|
-
autoload :CleanupService
|
|
161
|
-
autoload :ProvenanceMetadataService
|
|
162
|
-
autoload :TechnicalMetadataService
|
|
163
163
|
autoload :MergeService
|
|
164
|
-
autoload :
|
|
165
|
-
autoload :
|
|
164
|
+
autoload :Ontology
|
|
165
|
+
autoload :OpenDataLicenseService
|
|
166
|
+
autoload :ProvenanceMetadataService
|
|
166
167
|
autoload :PublicDescMetadataService
|
|
167
168
|
autoload :PublicXmlService
|
|
169
|
+
autoload :PublishMetadataService
|
|
170
|
+
autoload :RegistrationService
|
|
171
|
+
autoload :ReleaseTagService
|
|
172
|
+
autoload :ResetWorkspaceService
|
|
173
|
+
autoload :SdrIngestService
|
|
174
|
+
autoload :SearchService
|
|
175
|
+
autoload :SecondaryFileNameService
|
|
176
|
+
autoload :ShelvingService
|
|
177
|
+
autoload :StatusService
|
|
178
|
+
autoload :SuriService
|
|
179
|
+
autoload :TagService
|
|
180
|
+
autoload :TechnicalMetadataService
|
|
168
181
|
autoload :ThumbnailService
|
|
182
|
+
autoload :VersionService
|
|
183
|
+
autoload :WorkflowService
|
|
169
184
|
end
|
|
170
185
|
|
|
171
186
|
# Workflow Classes
|
data/lib/dor/config.rb
CHANGED
|
@@ -4,6 +4,7 @@ require 'confstruct/configuration'
|
|
|
4
4
|
require 'rsolr'
|
|
5
5
|
require 'yaml'
|
|
6
6
|
require 'dor/certificate_authenticated_rest_resource_factory'
|
|
7
|
+
require 'dor/services/client'
|
|
7
8
|
|
|
8
9
|
module Dor
|
|
9
10
|
class Configuration < Confstruct::Configuration
|
|
@@ -52,56 +53,58 @@ module Dor
|
|
|
52
53
|
|
|
53
54
|
def make_solr_connection(add_opts = {})
|
|
54
55
|
opts = Dor::Config.solr.opts.merge(add_opts).merge(
|
|
55
|
-
:
|
|
56
|
+
url: Dor::Config.solr.url
|
|
56
57
|
)
|
|
57
58
|
::RSolr.connect(opts)
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
set_callback :initialize, :after do |config|
|
|
61
|
-
config.deep_merge!(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
62
|
+
config.deep_merge!(
|
|
63
|
+
fedora: {
|
|
64
|
+
client: Confstruct.deferred { |_c| CertificateAuthenticatedRestResourceFactory.create(:fedora) },
|
|
65
|
+
safeurl: Confstruct.deferred do |_c|
|
|
66
|
+
begin
|
|
67
|
+
fedora_uri = URI.parse(config.fedora.url)
|
|
68
|
+
fedora_uri.user = fedora_uri.password = nil
|
|
69
|
+
fedora_uri.to_s
|
|
70
|
+
rescue URI::InvalidURIError
|
|
71
|
+
nil
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
},
|
|
75
|
+
dor_services: {
|
|
76
|
+
rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:dor_services) }
|
|
77
|
+
},
|
|
78
|
+
purl_services: {
|
|
79
|
+
rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:purl_services) }
|
|
80
|
+
},
|
|
81
|
+
sdr: {
|
|
82
|
+
rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:sdr) }
|
|
83
|
+
},
|
|
84
|
+
workflow: {
|
|
85
|
+
client: Confstruct.deferred do |c|
|
|
86
|
+
Dor::WorkflowService.configure c.url, logger: c.client_logger, timeout: c.timeout, dor_services_url: config.dor_services.url
|
|
87
|
+
Dor::WorkflowService
|
|
88
|
+
end,
|
|
89
|
+
client_logger: Confstruct.deferred do |c|
|
|
90
|
+
if c.logfile && c.shift_age
|
|
91
|
+
Logger.new(c.logfile, c.shift_age)
|
|
92
|
+
elsif c.logfile
|
|
93
|
+
Logger.new(c.logfile)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
}
|
|
97
|
+
)
|
|
97
98
|
true
|
|
98
99
|
end
|
|
99
100
|
|
|
100
101
|
set_callback :configure, :after do |config|
|
|
102
|
+
Dor::Services::Client.configure(url: config.dor_services.url) if config.dor_services
|
|
103
|
+
|
|
101
104
|
if config.solrizer.present?
|
|
102
105
|
stack = Kernel.caller.dup
|
|
103
106
|
stack.shift while stack[0] =~ %r{(active_support/callbacks|dor/config|dor-services)\.rb}
|
|
104
|
-
ActiveSupport::Deprecation.warn
|
|
107
|
+
ActiveSupport::Deprecation.warn 'Dor::Config -- solrizer configuration is deprecated. Please use solr instead.', stack
|
|
105
108
|
|
|
106
109
|
config.solrizer.each do |k, v|
|
|
107
110
|
config.solr[k] ||= v
|
|
@@ -120,7 +123,7 @@ module Dor
|
|
|
120
123
|
|
|
121
124
|
def fedora_config
|
|
122
125
|
fedora_uri = URI.parse(fedora.url)
|
|
123
|
-
connection_opts = { :
|
|
126
|
+
connection_opts = { url: fedora.safeurl, user: fedora_uri.user, password: fedora_uri.password }
|
|
124
127
|
connection_opts[:ssl_client_cert] = OpenSSL::X509::Certificate.new(File.read(ssl.cert_file)) if ssl.cert_file.present?
|
|
125
128
|
connection_opts[:ssl_client_key] = OpenSSL::PKey::RSA.new(File.read(ssl.key_file), ssl.key_pass) if ssl.key_file.present?
|
|
126
129
|
connection_opts[:ssl_cert_store] = default_ssl_cert_store
|
|
@@ -128,11 +131,11 @@ module Dor
|
|
|
128
131
|
end
|
|
129
132
|
|
|
130
133
|
def solr_config
|
|
131
|
-
{ :
|
|
134
|
+
{ url: solr.url }
|
|
132
135
|
end
|
|
133
136
|
|
|
134
137
|
def predicate_config
|
|
135
|
-
YAML.load(File.read(File.expand_path('
|
|
138
|
+
YAML.load(File.read(File.expand_path('../../config/predicate_mappings.yml', __dir__)))
|
|
136
139
|
end
|
|
137
140
|
|
|
138
141
|
def default_ssl_cert_store
|
|
@@ -140,6 +143,6 @@ module Dor
|
|
|
140
143
|
end
|
|
141
144
|
end
|
|
142
145
|
|
|
143
|
-
Config = Configuration.new(YAML.load(File.read(File.expand_path('
|
|
146
|
+
Config = Configuration.new(YAML.load(File.read(File.expand_path('../../config/config_defaults.yml', __dir__))))
|
|
144
147
|
ActiveFedora.configurator = Config
|
|
145
148
|
end
|
|
@@ -3,90 +3,90 @@
|
|
|
3
3
|
module Dor
|
|
4
4
|
class AdministrativeMetadataDS < ActiveFedora::OmDatastream
|
|
5
5
|
set_terminology do |t|
|
|
6
|
-
t.root :
|
|
7
|
-
t.metadata_format :
|
|
8
|
-
t.admin_metadata_format :
|
|
9
|
-
t.metadata_source :
|
|
6
|
+
t.root path: 'administrativeMetadata', index_as: [:not_searchable]
|
|
7
|
+
t.metadata_format path: 'descMetadata/format'
|
|
8
|
+
t.admin_metadata_format path: 'descMetadata/format', index_as: [:symbol]
|
|
9
|
+
t.metadata_source path: 'descMetadata/source', index_as: [:symbol]
|
|
10
10
|
t.descMetadata do
|
|
11
11
|
t.source
|
|
12
12
|
t.format
|
|
13
13
|
end
|
|
14
14
|
# Placeholders for existing defined stanzas to be fleshed out as needed
|
|
15
|
-
t.contact :
|
|
16
|
-
t.rights :
|
|
17
|
-
t.relationships :
|
|
18
|
-
t.registration :
|
|
15
|
+
t.contact index_as: [:not_searchable]
|
|
16
|
+
t.rights index_as: [:not_searchable]
|
|
17
|
+
t.relationships index_as: [:not_searchable]
|
|
18
|
+
t.registration index_as: [:not_searchable] do
|
|
19
19
|
t.agreementId
|
|
20
20
|
t.itemTag
|
|
21
|
-
t.workflow_id :
|
|
22
|
-
t.default_collection :
|
|
21
|
+
t.workflow_id path: 'workflow/@id', index_as: [:symbol]
|
|
22
|
+
t.default_collection path: 'collection/@id'
|
|
23
23
|
end
|
|
24
|
-
t.workflow :
|
|
25
|
-
t.deposit :
|
|
24
|
+
t.workflow path: 'registration/workflow'
|
|
25
|
+
t.deposit index_as: [:not_searchable]
|
|
26
26
|
|
|
27
|
-
t.accessioning :
|
|
28
|
-
t.workflow_id :
|
|
27
|
+
t.accessioning index_as: [:not_searchable] do
|
|
28
|
+
t.workflow_id path: 'workflow/@id', index_as: [:symbol]
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
t.preservation :
|
|
32
|
-
t.dissemination :
|
|
31
|
+
t.preservation index_as: [:not_searchable]
|
|
32
|
+
t.dissemination index_as: [:not_searchable] do
|
|
33
33
|
t.harvester
|
|
34
34
|
t.releaseDelayLimit
|
|
35
35
|
end
|
|
36
36
|
t.defaults do
|
|
37
|
-
t.initiate_workflow :
|
|
38
|
-
t.lane :
|
|
37
|
+
t.initiate_workflow path: 'initiateWorkflow' do
|
|
38
|
+
t.lane path: { attribute: 'lane' }
|
|
39
39
|
end
|
|
40
|
-
t.shelving :
|
|
41
|
-
t.path :
|
|
40
|
+
t.shelving path: 'shelving' do
|
|
41
|
+
t.path path: { attribute: 'path' }
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
define_template :default_collection do |xml|
|
|
47
|
-
xml.administrativeMetadata
|
|
48
|
-
xml.registration
|
|
49
|
-
xml.collection(:
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
xml.administrativeMetadata do
|
|
48
|
+
xml.registration do
|
|
49
|
+
xml.collection(id: '')
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
define_template :agreementId do |xml|
|
|
55
|
-
xml.administrativeMetadata
|
|
56
|
-
xml.registration
|
|
55
|
+
xml.administrativeMetadata do
|
|
56
|
+
xml.registration do
|
|
57
57
|
xml.agreementId
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
define_template :metadata_format do |xml|
|
|
63
|
-
xml.descMetadata
|
|
63
|
+
xml.descMetadata do
|
|
64
64
|
xml.format
|
|
65
|
-
|
|
65
|
+
end
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
define_template :metadata_source do |xml|
|
|
69
|
-
xml.administrativeMetadata
|
|
70
|
-
xml.descMetadata
|
|
69
|
+
xml.administrativeMetadata do
|
|
70
|
+
xml.descMetadata do
|
|
71
71
|
xml.source
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
define_template :registration do |xml|
|
|
77
|
-
xml.administrativeMetadata
|
|
78
|
-
xml.registration
|
|
79
|
-
xml.workflow(:
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
xml.administrativeMetadata do
|
|
78
|
+
xml.registration do
|
|
79
|
+
xml.workflow(id: '')
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
define_template :default_collection do |xml|
|
|
85
|
-
xml.administrativeMetadata
|
|
86
|
-
xml.registration
|
|
85
|
+
xml.administrativeMetadata do
|
|
86
|
+
xml.registration do
|
|
87
87
|
xml.collection
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
def self.xml_template
|
|
@@ -116,6 +116,99 @@ module Dor
|
|
|
116
116
|
defaults.shelving.path.first
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
+
# get all collections listed for this APO, used during registration
|
|
120
|
+
# @return [Array] array of pids
|
|
121
|
+
def default_collections
|
|
122
|
+
term_values(:registration, :default_collection)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Add a collection to the listing of collections for items governed by this apo.
|
|
126
|
+
# @param val [String] pid of the collection, ex. druid:ab123cd4567
|
|
127
|
+
def add_default_collection(val)
|
|
128
|
+
xml = ng_xml
|
|
129
|
+
ng_xml_will_change!
|
|
130
|
+
reg = xml.search('//administrativeMetadata/registration').first
|
|
131
|
+
unless reg
|
|
132
|
+
reg = Nokogiri::XML::Node.new('registration', xml)
|
|
133
|
+
xml.search('/administrativeMetadata').first.add_child(reg)
|
|
134
|
+
end
|
|
135
|
+
node = Nokogiri::XML::Node.new('collection', xml)
|
|
136
|
+
node['id'] = val
|
|
137
|
+
reg.add_child(node)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def remove_default_collection(val)
|
|
141
|
+
ng_xml_will_change!
|
|
142
|
+
ng_xml.search('//administrativeMetadata/registration/collection[@id=\'' + val + '\']').remove
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def metadata_source
|
|
146
|
+
super.first
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def metadata_source=(val)
|
|
150
|
+
if descMetadata.nil?
|
|
151
|
+
ng_xml_will_change!
|
|
152
|
+
add_child_node(administrativeMetadata, :descMetadata)
|
|
153
|
+
end
|
|
154
|
+
update_values(%i[descMetadata source] => val)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# List of default workflows, used to provide choices at registration
|
|
158
|
+
# @return [Array] and array of pids, ex ['druid:ab123cd4567']
|
|
159
|
+
def default_workflows
|
|
160
|
+
term_values(:registration, :workflow_id)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# set a single default workflow
|
|
164
|
+
# @param wf [String] the name of the workflow, ex. 'digitizationWF'
|
|
165
|
+
def default_workflow=(wf_name)
|
|
166
|
+
raise ArgumentError, 'Must have a valid workflow for default' if wf_name.blank?
|
|
167
|
+
|
|
168
|
+
xml = ng_xml
|
|
169
|
+
ng_xml_will_change!
|
|
170
|
+
nodes = xml.search('//registration/workflow')
|
|
171
|
+
if nodes.first
|
|
172
|
+
nodes.first['id'] = wf_name
|
|
173
|
+
else
|
|
174
|
+
nodes = xml.search('//registration')
|
|
175
|
+
unless nodes.first
|
|
176
|
+
reg_node = Nokogiri::XML::Node.new('registration', xml)
|
|
177
|
+
xml.root.add_child(reg_node)
|
|
178
|
+
end
|
|
179
|
+
nodes = xml.search('//registration')
|
|
180
|
+
wf_node = Nokogiri::XML::Node.new('workflow', xml)
|
|
181
|
+
wf_node['id'] = wf_name
|
|
182
|
+
nodes.first.add_child(wf_node)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def desc_metadata_format
|
|
187
|
+
metadata_format.first
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def desc_metadata_format=(format)
|
|
191
|
+
# create the node if it isnt there already
|
|
192
|
+
unless metadata_format.first
|
|
193
|
+
ng_xml_will_change!
|
|
194
|
+
add_child_node(ng_xml.root, :metadata_format)
|
|
195
|
+
end
|
|
196
|
+
update_values([:metadata_format] => format)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def desc_metadata_source
|
|
200
|
+
metadata_source.first
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def desc_metadata_source=(_source)
|
|
204
|
+
# create the node if it isnt there already
|
|
205
|
+
unless metadata_source.first
|
|
206
|
+
ng_xml_will_change!
|
|
207
|
+
add_child_node(administrativeMetadata.ng_xml.root, :metadata_source)
|
|
208
|
+
end
|
|
209
|
+
update_values([:metadata_source] => format)
|
|
210
|
+
end
|
|
211
|
+
|
|
119
212
|
# maintain AF < 8 indexing behavior
|
|
120
213
|
def prefix
|
|
121
214
|
''
|
|
@@ -5,34 +5,34 @@ require 'set'
|
|
|
5
5
|
module Dor
|
|
6
6
|
class ContentMetadataDS < ActiveFedora::OmDatastream
|
|
7
7
|
set_terminology do |t|
|
|
8
|
-
t.root :
|
|
9
|
-
t.contentType :
|
|
10
|
-
t.stacks :
|
|
11
|
-
t.resource(:
|
|
12
|
-
t.id_ :
|
|
13
|
-
t.sequence :
|
|
14
|
-
t.type_ :
|
|
15
|
-
t.attribute(:
|
|
16
|
-
t.name :
|
|
8
|
+
t.root path: 'contentMetadata', index_as: [:not_searchable]
|
|
9
|
+
t.contentType path: '/contentMetadata/@type', index_as: [:not_searchable]
|
|
10
|
+
t.stacks path: '/contentMetadata/@stacks', index_as: [:not_searchable]
|
|
11
|
+
t.resource(index_as: [:not_searchable]) do
|
|
12
|
+
t.id_ path: { attribute: 'id' }
|
|
13
|
+
t.sequence path: { attribute: 'sequence' } # , :data_type => :integer
|
|
14
|
+
t.type_ path: { attribute: 'type' }, index_as: [:displayable]
|
|
15
|
+
t.attribute(path: 'attr', index_as: [:not_searchable]) do
|
|
16
|
+
t.name path: { attribute: 'name' }, index_as: [:not_searchable]
|
|
17
17
|
end
|
|
18
|
-
t.file(:
|
|
19
|
-
t.id_ :
|
|
20
|
-
t.mimeType :
|
|
21
|
-
t.dataType :
|
|
22
|
-
t.size :
|
|
23
|
-
t.role :
|
|
24
|
-
t.shelve :
|
|
25
|
-
t.publish :
|
|
26
|
-
t.preserve :
|
|
18
|
+
t.file(index_as: [:not_searchable]) do
|
|
19
|
+
t.id_ path: { attribute: 'id' }
|
|
20
|
+
t.mimeType path: { attribute: 'mimeType' }, index_as: [:displayable]
|
|
21
|
+
t.dataType path: { attribute: 'dataType' }, index_as: [:displayable]
|
|
22
|
+
t.size path: { attribute: 'size' }, index_as: [:displayable] # , :data_type => :long
|
|
23
|
+
t.role path: { attribute: 'role' }, index_as: [:not_searchable]
|
|
24
|
+
t.shelve path: { attribute: 'shelve' }, index_as: [:not_searchable] # , :data_type => :boolean
|
|
25
|
+
t.publish path: { attribute: 'publish' }, index_as: [:not_searchable] # , :data_type => :boolean
|
|
26
|
+
t.preserve path: { attribute: 'preserve' }, index_as: [:not_searchable] # , :data_type => :boolean
|
|
27
27
|
t.checksum do
|
|
28
|
-
t.type_ :
|
|
28
|
+
t.type_ path: { attribute: 'type' }
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
|
-
t.shelved_file(:
|
|
32
|
-
t.id_ :
|
|
31
|
+
t.shelved_file(path: 'file', attributes: { shelve: 'yes' }, index_as: [:not_searchable]) do
|
|
32
|
+
t.id_ path: { attribute: 'id' }, index_as: %i[displayable stored_searchable]
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
|
-
t.shelved_file_id :
|
|
35
|
+
t.shelved_file_id proxy: %i[resource shelved_file id], index_as: %i[displayable stored_searchable]
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
### READ ONLY METHODS
|
|
@@ -80,7 +80,7 @@ module Dor
|
|
|
80
80
|
# Terminology-based solrization is going to be painfully slow for large
|
|
81
81
|
# contentMetadata streams. Just select the relevant elements instead.
|
|
82
82
|
# TODO: Call super()?
|
|
83
|
-
def to_solr(solr_doc = {}, *
|
|
83
|
+
def to_solr(solr_doc = {}, *_args)
|
|
84
84
|
doc = ng_xml
|
|
85
85
|
return solr_doc unless doc.root['type']
|
|
86
86
|
|
|
@@ -134,7 +134,7 @@ module Dor
|
|
|
134
134
|
resource_nodes = ng_xml.search('//resource[@id=\'' + resource_name + '\']')
|
|
135
135
|
raise 'resource doesnt exist.' if resource_nodes.length == 0
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
ng_xml_will_change!
|
|
138
138
|
|
|
139
139
|
node = resource_nodes.first
|
|
140
140
|
file_node = Nokogiri::XML::Node.new('file', ng_xml)
|
|
@@ -144,7 +144,7 @@ module Dor
|
|
|
144
144
|
file_node['preserve'] = file[:preserve] || ''
|
|
145
145
|
node.add_child(file_node)
|
|
146
146
|
|
|
147
|
-
[
|
|
147
|
+
%i[md5 sha1].each do |algo|
|
|
148
148
|
next unless file[algo]
|
|
149
149
|
|
|
150
150
|
checksum_node = Nokogiri::XML::Node.new('checksum', ng_xml)
|
|
@@ -165,7 +165,7 @@ module Dor
|
|
|
165
165
|
# @return [Nokogiri::XML::Element] the new resource that was added to the contentMetadata
|
|
166
166
|
def add_virtual_resource(child_druid, child_resource)
|
|
167
167
|
# create a virtual resource element with attributes linked to the child and omit label
|
|
168
|
-
|
|
168
|
+
ng_xml_will_change!
|
|
169
169
|
sequence_max = ng_xml.search('//resource').map { |node| node[:sequence].to_i }.max
|
|
170
170
|
resource = Nokogiri::XML::Element.new('resource', ng_xml)
|
|
171
171
|
resource[:sequence] = sequence_max + 1
|
|
@@ -191,7 +191,7 @@ module Dor
|
|
|
191
191
|
def add_resource(files, resource_name, position, type = 'file')
|
|
192
192
|
raise "resource #{resource_name} already exists" if ng_xml.search('//resource[@id=\'' + resource_name + '\']').length > 0
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
ng_xml_will_change!
|
|
195
195
|
max = ng_xml.search('//resource').map { |node| node['sequence'].to_i }.max
|
|
196
196
|
# renumber all of the resources that will come after the newly added one
|
|
197
197
|
while max > position
|
|
@@ -209,14 +209,14 @@ module Dor
|
|
|
209
209
|
file_node['id'] = file[:name]
|
|
210
210
|
node.add_child(file_node)
|
|
211
211
|
|
|
212
|
-
[
|
|
212
|
+
%i[md5 sha1].each do |algo|
|
|
213
213
|
next if file[algo].nil?
|
|
214
214
|
|
|
215
215
|
checksum_node = Nokogiri::XML::Node.new('checksum', ng_xml)
|
|
216
216
|
checksum_node['type'] = algo.to_s
|
|
217
217
|
checksum_node.content = file[algo]
|
|
218
218
|
file_node.add_child(checksum_node)
|
|
219
|
-
|
|
219
|
+
end
|
|
220
220
|
file_node['size'] = file[:size] if file[:size]
|
|
221
221
|
file_node['role'] = file[:role] if file[:role]
|
|
222
222
|
end
|
|
@@ -226,7 +226,7 @@ module Dor
|
|
|
226
226
|
|
|
227
227
|
# @param [String] resource_name ID of the resource
|
|
228
228
|
def remove_resource(resource_name)
|
|
229
|
-
|
|
229
|
+
ng_xml_will_change!
|
|
230
230
|
node = singular_node('//resource[@id=\'' + resource_name + '\']')
|
|
231
231
|
position = node['sequence'].to_i + 1
|
|
232
232
|
node.remove
|
|
@@ -241,7 +241,7 @@ module Dor
|
|
|
241
241
|
|
|
242
242
|
# @param [String] file_name ID of the file element
|
|
243
243
|
def remove_file(file_name)
|
|
244
|
-
|
|
244
|
+
ng_xml_will_change!
|
|
245
245
|
ng_xml.search('//file[@id=\'' + file_name + '\']').each(&:remove)
|
|
246
246
|
end
|
|
247
247
|
|
|
@@ -250,7 +250,7 @@ module Dor
|
|
|
250
250
|
# @param [String] shelve
|
|
251
251
|
# @param [String] preserve
|
|
252
252
|
def update_attributes(file_name, publish, shelve, preserve, attributes = {})
|
|
253
|
-
|
|
253
|
+
ng_xml_will_change!
|
|
254
254
|
file_node = ng_xml.search('//file[@id=\'' + file_name + '\']').first
|
|
255
255
|
file_node['publish'] = publish
|
|
256
256
|
file_node['shelve'] = shelve
|
|
@@ -263,10 +263,10 @@ module Dor
|
|
|
263
263
|
# @param file [Object] some hash-like file
|
|
264
264
|
# @param old_file_id [String] unique id attribute of the file element
|
|
265
265
|
def update_file(file, old_file_id)
|
|
266
|
-
|
|
266
|
+
ng_xml_will_change!
|
|
267
267
|
file_node = ng_xml.search('//file[@id=\'' + old_file_id + '\']').first
|
|
268
268
|
file_node['id'] = file[:name]
|
|
269
|
-
[
|
|
269
|
+
%i[md5 sha1].each do |algo|
|
|
270
270
|
next if file[algo].nil?
|
|
271
271
|
|
|
272
272
|
checksum_node = ng_xml.search('//file[@id=\'' + old_file_id + '\']/checksum[@type=\'' + algo.to_s + '\']').first
|
|
@@ -276,18 +276,18 @@ module Dor
|
|
|
276
276
|
end
|
|
277
277
|
checksum_node['type'] = algo.to_s
|
|
278
278
|
checksum_node.content = file[algo]
|
|
279
|
-
|
|
279
|
+
end
|
|
280
280
|
|
|
281
|
-
[
|
|
281
|
+
%i[size shelve preserve publish role].each do |x|
|
|
282
282
|
file_node[x.to_s] = file[x] if file[x]
|
|
283
|
-
|
|
283
|
+
end
|
|
284
284
|
end
|
|
285
285
|
|
|
286
286
|
# @param old_name [String] unique id attribute of the file element
|
|
287
287
|
# @param new_name [String] new unique id value being assigned
|
|
288
288
|
# @return [Nokogiri::XML::Element] the file node
|
|
289
289
|
def rename_file(old_name, new_name)
|
|
290
|
-
|
|
290
|
+
ng_xml_will_change!
|
|
291
291
|
file_node = ng_xml.search('//file[@id=\'' + old_name + '\']').first
|
|
292
292
|
file_node['id'] = new_name
|
|
293
293
|
file_node
|
|
@@ -298,7 +298,7 @@ module Dor
|
|
|
298
298
|
# @param new_label [String] label value being assigned
|
|
299
299
|
# @return [Nokogiri::XML::Element] the resource node
|
|
300
300
|
def update_resource_label(resource_name, new_label)
|
|
301
|
-
|
|
301
|
+
ng_xml_will_change!
|
|
302
302
|
node = singular_node('//resource[@id=\'' + resource_name + '\']')
|
|
303
303
|
labels = node.xpath('./label')
|
|
304
304
|
if labels.length == 0
|
|
@@ -314,7 +314,7 @@ module Dor
|
|
|
314
314
|
# @param resource_name [String] unique id attribute of the resource
|
|
315
315
|
# @param new_type [String] type value being assigned
|
|
316
316
|
def update_resource_type(resource_name, new_type)
|
|
317
|
-
|
|
317
|
+
ng_xml_will_change!
|
|
318
318
|
singular_node('//resource[@id=\'' + resource_name + '\']')['type'] = new_type
|
|
319
319
|
end
|
|
320
320
|
|
|
@@ -324,7 +324,7 @@ module Dor
|
|
|
324
324
|
# @param new_position [Integer, String] new sequence number of the resource, or a string that looks like one
|
|
325
325
|
# @return [Nokogiri::XML::Element] the resource node
|
|
326
326
|
def move_resource(resource_name, new_position)
|
|
327
|
-
|
|
327
|
+
ng_xml_will_change!
|
|
328
328
|
node = singular_node('//resource[@id=\'' + resource_name + '\']')
|
|
329
329
|
position = node['sequence'].to_i
|
|
330
330
|
new_position = new_position.to_i # tolerate strings as a Legacy behavior
|
|
@@ -347,7 +347,7 @@ module Dor
|
|
|
347
347
|
# @param [String] new_type the new content type
|
|
348
348
|
# @param [String] new_resource_type the new type for all resources
|
|
349
349
|
def set_content_type(old_type, old_resource_type, new_type, new_resource_type)
|
|
350
|
-
|
|
350
|
+
ng_xml_will_change!
|
|
351
351
|
ng_xml.search('/contentMetadata[@type=\'' + old_type + '\']').each do |node|
|
|
352
352
|
node['type'] = new_type
|
|
353
353
|
ng_xml.search('//resource[@type=\'' + old_resource_type + '\']').each do |resource|
|