dor-services 6.8.0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
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