dor-services 6.8.0 → 7.0.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/config/config_defaults.yml +0 -27
  3. data/config/dev_console_env.rb.example +0 -17
  4. data/lib/dor-services.rb +9 -73
  5. data/lib/dor/config.rb +1 -30
  6. data/lib/dor/datastreams/content_metadata_ds.rb +8 -0
  7. data/lib/dor/datastreams/desc_metadata_ds.rb +19 -0
  8. data/lib/dor/datastreams/identity_metadata_ds.rb +65 -0
  9. data/lib/dor/datastreams/rights_metadata_ds.rb +14 -2
  10. data/lib/dor/datastreams/workflow_definition_ds.rb +1 -1
  11. data/lib/dor/datastreams/workflow_ds.rb +0 -15
  12. data/lib/dor/indexers/identifiable_indexer.rb +8 -4
  13. data/lib/dor/indexers/releasable_indexer.rb +7 -1
  14. data/lib/dor/models/abstract.rb +143 -8
  15. data/lib/dor/models/admin_policy_object.rb +0 -3
  16. data/lib/dor/models/collection.rb +0 -2
  17. data/lib/dor/models/concerns/embargoable.rb +7 -60
  18. data/lib/dor/models/etd.rb +100 -0
  19. data/lib/dor/models/item.rb +12 -28
  20. data/lib/dor/models/part.rb +18 -0
  21. data/lib/dor/models/set.rb +0 -2
  22. data/lib/dor/services/collection_service.rb +36 -0
  23. data/lib/dor/services/embargo_service.rb +93 -0
  24. data/lib/dor/services/ontology.rb +0 -18
  25. data/lib/dor/services/public_desc_metadata_service.rb +7 -11
  26. data/lib/dor/services/search_service.rb +0 -40
  27. data/lib/dor/version.rb +1 -1
  28. data/lib/dor/workflow/document.rb +0 -7
  29. metadata +15 -78
  30. data/lib/dor/models/concerns/assembleable.rb +0 -18
  31. data/lib/dor/models/concerns/contentable.rb +0 -185
  32. data/lib/dor/models/concerns/describable.rb +0 -82
  33. data/lib/dor/models/concerns/eventable.rb +0 -18
  34. data/lib/dor/models/concerns/geoable.rb +0 -14
  35. data/lib/dor/models/concerns/governable.rb +0 -101
  36. data/lib/dor/models/concerns/identifiable.rb +0 -172
  37. data/lib/dor/models/concerns/itemizable.rb +0 -42
  38. data/lib/dor/models/concerns/preservable.rb +0 -46
  39. data/lib/dor/models/concerns/processable.rb +0 -86
  40. data/lib/dor/models/concerns/publishable.rb +0 -76
  41. data/lib/dor/models/concerns/releaseable.rb +0 -118
  42. data/lib/dor/models/concerns/rightsable.rb +0 -25
  43. data/lib/dor/models/concerns/shelvable.rb +0 -15
  44. data/lib/dor/models/concerns/versionable.rb +0 -72
  45. data/lib/dor/services/ability.rb +0 -77
  46. data/lib/dor/services/cleanup_reset_service.rb +0 -103
  47. data/lib/dor/services/datastream_builder.rb +0 -96
  48. data/lib/dor/services/decommission_service.rb +0 -31
  49. data/lib/dor/services/digital_stacks_service.rb +0 -125
  50. data/lib/dor/services/dublin_core_service.rb +0 -45
  51. data/lib/dor/services/file_metadata_merge_service.rb +0 -71
  52. data/lib/dor/services/indexing_service.rb +0 -131
  53. data/lib/dor/services/merge_service.rb +0 -105
  54. data/lib/dor/services/public_xml_service.rb +0 -116
  55. data/lib/dor/services/publish_metadata_service.rb +0 -99
  56. data/lib/dor/services/reset_workspace_service.rb +0 -27
  57. data/lib/dor/services/sdr_ingest_service.rb +0 -172
  58. data/lib/dor/services/secondary_file_name_service.rb +0 -10
  59. data/lib/dor/services/shelving_service.rb +0 -69
  60. data/lib/dor/services/technical_metadata_service.rb +0 -232
  61. data/lib/dor/services/version_service.rb +0 -84
  62. data/lib/dor/utils/sdr_client.rb +0 -94
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85d61e2ff2890b4d25489c7dd7ecdd696d29b6dc1fc71939045cdb5ce801d914
4
- data.tar.gz: 27b4b9d65371523af32aa306670d783e8da0abc9f04e44d3a001ad99ba2b7f6f
3
+ metadata.gz: af6de5f57ae4ad7e16df5978e27c65131671d88f32e0c006d5ea1389015c53a0
4
+ data.tar.gz: 5c478ce40e0e5a77ea9baecc8f2403d5b3d204629b7dfe315793e1ca0a6d86d8
5
5
  SHA512:
6
- metadata.gz: f44b068a8964f6873fd493d3ef274cc98dd8faa9ba619ade56197892d3783a82ab83a9dae62edfd3cc5c7ef6c183f37ae8ed012ad2544941d31e51498d7e260d
7
- data.tar.gz: cf2d94e214f0d002d64d01003cb52e8952167fa310c641f3809a4bcc8dd7235924d6461ca7cb42644b8c7e12c5f95a36c215ba69e1839f6703d555692e0ba9df
6
+ metadata.gz: 9ff7af6435417ea9e9b94e21ff2d986cc6fb36b31a2753a493301bc8ca0ab2dca1a7573e9999d151da645a7faaa235ee841882903221cd45eabb3cfb0ea05c01
7
+ data.tar.gz: 895a93feab7403be4f38c31708280e6978397c4641a758d815610fc767ea212059356243b32f9d649e34ec998d60a0c5d25a6427446f72cb0e9f14e10b1d78a2
@@ -12,25 +12,11 @@
12
12
  :solr:
13
13
  :url:
14
14
  :opts: {}
15
- :solrizer: {} # deprecated
16
15
  :metadata:
17
16
  :catalog:
18
17
  :url:
19
18
  :user:
20
19
  :pass:
21
- :sdr:
22
- :local_workspace_root: /dor/workspace
23
- :local_export_home: /dor/export
24
- :datastreams:
25
- :rightsMetadata: optional
26
- :descMetadata: required
27
- :sourceMetadata: optional
28
- :identityMetadata: required
29
- :provenanceMetadata: required
30
- :relationshipMetadata: required
31
- :technicalMetadata: required
32
- :contentMetadata: required
33
- :rest_url: ""
34
20
  :stacks:
35
21
  :local_workspace_root: /dor
36
22
  :host:
@@ -54,16 +40,3 @@
54
40
  :shift_age: weekly
55
41
  :dor_services:
56
42
  :url:
57
- :dor_indexing_app:
58
- :url:
59
- :indexing_svc:
60
- :log: 'log/indexing_svc.log'
61
- :log_date_format_str: '%Y-%m-%d %H:%M:%S.%L'
62
- :log_rotation_interval: 'daily'
63
- :goobi:
64
- :url:
65
- :dpg_workflow_name: 'goobiWF'
66
- :default_goobi_workflow_name: 'Example_Workflow'
67
- :max_tries: 3
68
- :max_sleep_seconds: 20
69
- :base_sleep_seconds: 2
@@ -44,21 +44,4 @@ Dor::Config.configure do
44
44
  local_workspace_root '/dor/workspace'
45
45
  local_export_home '/dor/export'
46
46
  end
47
-
48
- sdr do
49
- local_workspace_root '/dor/workspace'
50
- local_export_home '/dor/export'
51
- datastreams do
52
- contentMetadata 'required'
53
- descMetadata 'required'
54
- identityMetadata 'required'
55
- provenanceMetadata 'required'
56
- relationshipMetadata 'required'
57
- rightsMetadata 'optional'
58
- sourceMetadata 'optional'
59
- end
60
- end
61
-
62
- accessioning_robot_sleep_time 30
63
-
64
47
  end
data/lib/dor-services.rb CHANGED
@@ -4,28 +4,18 @@ require 'active_fedora'
4
4
  require 'active_fedora/version'
5
5
  require 'active_support/core_ext/module/attribute_accessors'
6
6
  require 'active_support/core_ext/object/blank'
7
- require 'dor/utils/sdr_client'
7
+ require 'deprecation'
8
8
 
9
9
  module Dor
10
10
  extend ActiveSupport::Autoload
11
11
  @@registered_classes = {}
12
12
  mattr_reader :registered_classes
13
- INDEX_VERSION_FIELD = 'dor_services_version_ssi'
14
13
 
15
14
  class << self
16
15
  def configure(*args, &block)
17
16
  Dor::Config.configure *args, &block
18
17
  end
19
18
 
20
- # Load an object and inspect its identityMetadata to figure out what class
21
- # to adapt it to. This is necessary when the object is not indexed, or the
22
- # index is missing the objectType property.
23
- # @param [String] pid The object's PID
24
- def load_instance(pid)
25
- Deprecation.warn(self, 'load_instance is deprecated, use Dor.find instead')
26
- find(pid)
27
- end
28
-
29
19
  # Load an object and inspect its identityMetadata to figure out what class
30
20
  # to adapt it to.
31
21
  # @param [String] pid The object's PID
@@ -34,27 +24,6 @@ module Dor
34
24
  Dor::Abstract.find pid, cast: true
35
25
  end
36
26
 
37
- # TODO: return enumerable and lazy load_instance
38
- # TODO: restrict fieldlist (fl) for non-:lightweight queries
39
- def find_all(query, opts = {})
40
- ActiveSupport::Deprecation.warn 'Dor.find_all is deprecated; use activefedora finders instead'
41
-
42
- resp = SearchService.query query, opts
43
- resp['response']['docs'].collect do |solr_doc|
44
- find solr_doc['id']
45
- end
46
- end
47
-
48
- # @deprecated
49
- def ensure_models_loaded!
50
- ActiveSupport::Deprecation.warn 'Dor.ensure_models_loaded! is unnecessary and has been deprecated.'
51
- eager_load!
52
- end
53
-
54
- def root
55
- File.dirname(__FILE__)
56
- end
57
-
58
27
  def logger
59
28
  require 'logger'
60
29
  @logger ||= if defined?(::Rails) && ::Rails.respond_to?(:logger)
@@ -65,10 +34,6 @@ module Dor
65
34
  end
66
35
  end
67
36
 
68
- def logger
69
- Dor.logger
70
- end
71
-
72
37
  require 'dor/version'
73
38
  require 'dor/config'
74
39
  require 'dor/exceptions'
@@ -116,34 +81,20 @@ module Dor
116
81
 
117
82
  # DOR Concerns
118
83
  autoload_under 'models/concerns' do
119
- autoload :Identifiable
120
- autoload :Itemizable
121
- autoload :Processable
122
- autoload :Governable
123
- autoload :Describable
124
- autoload :Publishable
125
- autoload :Shelvable
126
84
  autoload :Embargoable
127
- autoload :Preservable
128
- autoload :Assembleable
129
- autoload :Eventable
130
- autoload :Versionable
131
- autoload :Contentable
132
- autoload :Discoverable
133
- autoload :Geoable
134
- autoload :Releaseable
135
- autoload :Rightsable
136
85
  end
137
86
 
138
87
  eager_autoload do
139
88
  # ActiveFedora Classes
140
89
  autoload_under 'models' do
141
90
  autoload :Abstract
91
+ autoload :AdminPolicyObject
142
92
  autoload :Agreement
93
+ autoload :Collection
94
+ autoload :Etd
143
95
  autoload :Item
96
+ autoload :Part
144
97
  autoload :Set
145
- autoload :Collection
146
- autoload :AdminPolicyObject
147
98
  autoload :WorkflowObject
148
99
  autoload :WorkflowSolrDocument
149
100
  end
@@ -151,38 +102,23 @@ module Dor
151
102
 
152
103
  # Services
153
104
  autoload_under 'services' do
154
- autoload :Ability
155
- autoload :CleanupResetService
156
105
  autoload :CleanupService
106
+ autoload :CollectionService
157
107
  autoload :CreateWorkflowService
158
108
  autoload :CreativeCommonsLicenseService
159
- autoload :DatastreamBuilder
160
- autoload :DecommissionService
161
- autoload :DigitalStacksService
162
- autoload :DublinCoreService
163
- autoload :FileMetadataMergeService
109
+ autoload :EmbargoService
164
110
  autoload :IndexingService
165
111
  autoload :MetadataService
166
- autoload :MergeService
167
112
  autoload :Ontology
168
113
  autoload :OpenDataLicenseService
169
- autoload :ProvenanceMetadataService
170
114
  autoload :PublicDescMetadataService
171
- autoload :PublicXmlService
172
- autoload :PublishMetadataService
173
- autoload :RegistrationService
115
+ autoload :PublishedRelationshipsFilter
174
116
  autoload :ReleaseTagService
175
- autoload :ResetWorkspaceService
176
- autoload :SdrIngestService
177
117
  autoload :SearchService
178
- autoload :SecondaryFileNameService
179
- autoload :ShelvingService
180
118
  autoload :StatusService
181
119
  autoload :SuriService
182
120
  autoload :TagService
183
- autoload :TechnicalMetadataService
184
121
  autoload :ThumbnailService
185
- autoload :VersionService
186
122
  end
187
123
 
188
124
  # Workflow Classes
@@ -195,5 +131,5 @@ module Dor
195
131
  eager_load!
196
132
 
197
133
  require 'dor/utils/hydrus_shims'
198
- require 'dor-workflow-service'
134
+ require 'dor/workflow/client'
199
135
  end
data/lib/dor/config.rb CHANGED
@@ -32,25 +32,10 @@ module Dor
32
32
  result
33
33
  end
34
34
 
35
- def autoconfigure(url, cert_file = Config.ssl.cert_file, key_file = Config.ssl.key_file, key_pass = Config.ssl.key_pass)
36
- client = make_rest_client(url, cert_file, key_file, key_pass)
37
- config = Confstruct::Configuration.symbolize_hash JSON.parse(client.get(accept: 'application/json'))
38
- configure(config)
39
- end
40
- deprecation_deprecate :autoconfigure
41
-
42
35
  def sanitize
43
36
  dup
44
37
  end
45
38
 
46
- def make_rest_client(url, cert = Config.ssl.cert_file, key = Config.ssl.key_file, pass = Config.ssl.key_pass)
47
- params = {}
48
- params[:ssl_client_cert] = OpenSSL::X509::Certificate.new(File.read(cert)) if cert
49
- params[:ssl_client_key] = OpenSSL::PKey::RSA.new(File.read(key), pass) if key
50
- RestClient::Resource.new(url, params)
51
- end
52
- deprecation_deprecate :make_rest_client
53
-
54
39
  def make_solr_connection(add_opts = {})
55
40
  opts = Dor::Config.solr.opts.merge(add_opts).merge(
56
41
  url: Dor::Config.solr.url
@@ -78,13 +63,9 @@ module Dor
78
63
  purl_services: {
79
64
  rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:purl_services) }
80
65
  },
81
- sdr: {
82
- rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:sdr) }
83
- },
84
66
  workflow: {
85
67
  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
68
+ @wfs ||= Dor::Workflow::Client.new(url: c.url, logger: c.client_logger, timeout: c.timeout)
88
69
  end,
89
70
  client_logger: Confstruct.deferred do |c|
90
71
  if c.logfile && c.shift_age
@@ -101,16 +82,6 @@ module Dor
101
82
  set_callback :configure, :after do |config|
102
83
  configure_client!(config)
103
84
 
104
- if config.solrizer.present?
105
- stack = Kernel.caller.dup
106
- stack.shift while stack[0] =~ %r{(active_support/callbacks|dor/config|dor-services)\.rb}
107
- ActiveSupport::Deprecation.warn 'Dor::Config -- solrizer configuration is deprecated. Please use solr instead.', stack
108
-
109
- config.solrizer.each do |k, v|
110
- config.solr[k] ||= v
111
- end
112
- end
113
-
114
85
  if config.solr.url.present?
115
86
  ActiveFedora::SolrService.register
116
87
  ActiveFedora::SolrService.instance.instance_variable_set :@conn, make_solr_connection
@@ -127,6 +127,14 @@ module Dor
127
127
  ### END: READ ONLY METHODS
128
128
  ### DATSTREAM WRITING METHODS
129
129
 
130
+ def unshelve_and_unpublish
131
+ ng_xml.xpath('/contentMetadata/resource//file').each_with_index do |file_node, index|
132
+ ng_xml_will_change! if index == 0
133
+ file_node['publish'] = 'no'
134
+ file_node['shelve'] = 'no'
135
+ end
136
+ end
137
+
130
138
  # @param [Object] file
131
139
  # @param [String] resource_name
132
140
  # @return [Nokogiri::XML::Node] the added XML node
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'stanford-mods'
4
+
3
5
  module Dor
6
+ # Descriptive metadata
4
7
  class DescMetadataDS < ActiveFedora::OmDatastream
5
8
  MODS_NS = 'http://www.loc.gov/mods/v3'
6
9
  MODS_HEADER_CONFIG = {
@@ -61,6 +64,22 @@ module Dor
61
64
  update_values(%i[title_info main_title] => val)
62
65
  end
63
66
 
67
+ # intended for read-access, "as SearchWorks would see it", mostly for to_solr()
68
+ # @param [Nokogiri::XML::Document] content Nokogiri descMetadata document (overriding internal data)
69
+ # @param [boolean] ns_aware namespace awareness toggle for from_nk_node()
70
+ def stanford_mods(content = nil, ns_aware = true)
71
+ @stanford_mods ||= begin
72
+ m = Stanford::Mods::Record.new
73
+ desc = content.nil? ? ng_xml : content
74
+ m.from_nk_node(desc.root, ns_aware)
75
+ m
76
+ end
77
+ end
78
+
79
+ def full_title
80
+ stanford_mods.sw_title_display
81
+ end
82
+
64
83
  # maintain AF < 8 indexing behavior
65
84
  def prefix
66
85
  ''
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dor
4
+ # Object identity and source metadata
4
5
  class IdentityMetadataDS < ActiveFedora::OmDatastream
5
6
  include SolrDocHelper
6
7
 
8
+ # ids for previous and current catkeys
9
+ CATKEY_TYPE_ID = 'catkey'
10
+ PREVIOUS_CATKEY_TYPE_ID = 'previous_catkey'
11
+
7
12
  set_terminology do |t|
8
13
  t.root(path: 'identityMetadata')
9
14
  t.objectId index_as: [:symbol]
@@ -42,6 +47,7 @@ module Dor
42
47
  node = find_by_terms(:sourceId).first
43
48
  node ? [node['source'], node.text].join(':') : nil
44
49
  end
50
+ alias source_id sourceId
45
51
 
46
52
  # @param [String, Nil] value The value to set or a nil/empty string to delete sourceId node
47
53
  # @return [String, Nil] The same value, as per Ruby convention for assignment operators
@@ -61,11 +67,18 @@ module Dor
61
67
  node['source'] = parts[0]
62
68
  node.content = parts[1]
63
69
  end
70
+ alias source_id= sourceId=
64
71
 
65
72
  def tags
66
73
  ng_xml.search('//tag').collect(&:content)
67
74
  end
68
75
 
76
+ # helper method to get just the content type tag
77
+ def content_type_tag
78
+ content_tag = tags.select { |tag| tag.include?('Process : Content Type') }
79
+ content_tag.size == 1 ? content_tag[0].split(':').last.strip : ''
80
+ end
81
+
69
82
  def otherId(type = nil)
70
83
  result = find_by_terms(:otherId).to_a
71
84
  if type.nil?
@@ -84,6 +97,58 @@ module Dor
84
97
  node
85
98
  end
86
99
 
100
+ def add_other_Id(type, val)
101
+ raise 'There is an existing entry for ' + type + ', consider using update_other_Id().' if otherId(type).length > 0
102
+
103
+ add_otherId(type + ':' + val)
104
+ end
105
+
106
+ def update_other_Id(type, new_val, val = nil)
107
+ ng_xml.search('//otherId[@name=\'' + type + '\']')
108
+ .select { |node| val.nil? || node.content == val }
109
+ .each { ng_xml_will_change! }
110
+ .each { |node| node.content = new_val }
111
+ .any?
112
+ end
113
+
114
+ def remove_other_Id(type, val = nil)
115
+ ng_xml.search('//otherId[@name=\'' + type + '\']')
116
+ .select { |node| val.nil? || node.content == val }
117
+ .each { ng_xml_will_change! }
118
+ .each(&:remove)
119
+ .any?
120
+ end
121
+
122
+ # Convenience method to get the current catkey
123
+ # @return [String] current catkey value (or nil if none found)
124
+ def catkey
125
+ otherId(CATKEY_TYPE_ID).first
126
+ end
127
+
128
+ # Convenience method to set the catkey
129
+ # @param [String] val the new source identifier
130
+ # @return [String] same value, as per Ruby assignment convention
131
+ def catkey=(val)
132
+ # if there was already a catkey in the record, store that in the "previous" spot (assuming there is no change)
133
+ add_otherId("#{PREVIOUS_CATKEY_TYPE_ID}:#{catkey}") if val != catkey && !catkey.blank?
134
+
135
+ if val.blank? # if we are setting the catkey to blank, remove the node from XML
136
+ remove_other_Id(CATKEY_TYPE_ID)
137
+ elsif catkey.blank? # if there is no current catkey, then add it
138
+ add_other_Id(CATKEY_TYPE_ID, val)
139
+ else # if there is a current catkey, update the current catkey to the new value
140
+ update_other_Id(CATKEY_TYPE_ID, val)
141
+ end
142
+
143
+ val
144
+ end
145
+
146
+ # Convenience method to get the previous catkeys (will be an array)
147
+ # @return [Array] previous catkey values (empty array if none found)
148
+ def previous_catkeys
149
+ otherId(PREVIOUS_CATKEY_TYPE_ID)
150
+ end
151
+
87
152
  def to_solr(solr_doc = {}, *args)
88
153
  solr_doc = super(solr_doc, *args)
89
154
 
@@ -120,7 +120,6 @@ module Dor
120
120
  end
121
121
 
122
122
  # @param rights [string] archetypical rights to assign: 'world', 'stanford', 'none', 'dark', etc
123
- # Moved from Governable
124
123
  # slight misnomer: also sets discover rights!
125
124
  # TODO: convert xpath reads to dra_object calls
126
125
  def set_read_rights(rights)
@@ -216,5 +215,18 @@ module Dor
216
215
  def prefix
217
216
  ''
218
217
  end
219
- end # class
218
+
219
+ def rights
220
+ xml = ng_xml
221
+ if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
222
+ 'Stanford'
223
+ elsif xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length == 1
224
+ 'World'
225
+ elsif xml.search('//rightsMetadata/access[@type=\'discover\']/machine/none').length == 1
226
+ 'Dark'
227
+ else
228
+ 'None'
229
+ end
230
+ end
231
+ end
220
232
  end