dor-services 5.2.0 → 5.3.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 (71) hide show
  1. checksums.yaml +5 -13
  2. data/config/certs/robots-dor-dev.crt +29 -0
  3. data/config/certs/robots-dor-dev.key +27 -0
  4. data/config/config_defaults.yml +2 -0
  5. data/config/dev_console_env.rb +77 -0
  6. data/lib/dor-services.rb +31 -27
  7. data/lib/dor/config.rb +25 -19
  8. data/lib/dor/datastreams/administrative_metadata_ds.rb +19 -20
  9. data/lib/dor/datastreams/content_metadata_ds.rb +238 -177
  10. data/lib/dor/datastreams/datastream_spec_solrizer.rb +1 -1
  11. data/lib/dor/datastreams/default_object_rights_ds.rb +99 -16
  12. data/lib/dor/datastreams/desc_metadata_ds.rb +37 -34
  13. data/lib/dor/datastreams/embargo_metadata_ds.rb +16 -16
  14. data/lib/dor/datastreams/events_ds.rb +2 -2
  15. data/lib/dor/datastreams/geo_metadata_ds.rb +5 -10
  16. data/lib/dor/datastreams/identity_metadata_ds.rb +22 -22
  17. data/lib/dor/datastreams/rights_metadata_ds.rb +43 -32
  18. data/lib/dor/datastreams/role_metadata_ds.rb +5 -5
  19. data/lib/dor/datastreams/simple_dublin_core_ds.rb +13 -14
  20. data/lib/dor/datastreams/version_metadata_ds.rb +22 -23
  21. data/lib/dor/datastreams/workflow_definition_ds.rb +15 -15
  22. data/lib/dor/datastreams/workflow_ds.rb +64 -70
  23. data/lib/dor/exceptions.rb +0 -1
  24. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +4 -4
  25. data/lib/dor/migrations/processable/unify_workflows.rb +1 -1
  26. data/lib/dor/models/admin_policy_object.rb +4 -4
  27. data/lib/dor/models/assembleable.rb +2 -3
  28. data/lib/dor/models/collection.rb +1 -1
  29. data/lib/dor/models/contentable.rb +113 -108
  30. data/lib/dor/models/describable.rb +136 -95
  31. data/lib/dor/models/editable.rb +205 -119
  32. data/lib/dor/models/embargoable.rb +16 -16
  33. data/lib/dor/models/eventable.rb +2 -2
  34. data/lib/dor/models/geoable.rb +3 -3
  35. data/lib/dor/models/governable.rb +25 -26
  36. data/lib/dor/models/identifiable.rb +66 -55
  37. data/lib/dor/models/item.rb +0 -1
  38. data/lib/dor/models/itemizable.rb +7 -8
  39. data/lib/dor/models/preservable.rb +7 -8
  40. data/lib/dor/models/processable.rb +76 -73
  41. data/lib/dor/models/publishable.rb +25 -30
  42. data/lib/dor/models/releaseable.rb +118 -155
  43. data/lib/dor/models/rightsable.rb +2 -3
  44. data/lib/dor/models/set.rb +1 -1
  45. data/lib/dor/models/shelvable.rb +8 -10
  46. data/lib/dor/models/upgradable.rb +5 -6
  47. data/lib/dor/models/versionable.rb +3 -4
  48. data/lib/dor/models/workflow_object.rb +15 -16
  49. data/lib/dor/services/cleanup_reset_service.rb +15 -16
  50. data/lib/dor/services/cleanup_service.rb +2 -4
  51. data/lib/dor/services/digital_stacks_service.rb +10 -13
  52. data/lib/dor/services/merge_service.rb +8 -9
  53. data/lib/dor/services/metadata_handlers/catalog_handler.rb +1 -1
  54. data/lib/dor/services/metadata_handlers/mdtoolkit_handler.rb +3 -3
  55. data/lib/dor/services/metadata_service.rb +19 -20
  56. data/lib/dor/services/registration_service.rb +80 -61
  57. data/lib/dor/services/reset_workspace_service.rb +6 -10
  58. data/lib/dor/services/sdr_ingest_service.rb +15 -16
  59. data/lib/dor/services/search_service.rb +18 -23
  60. data/lib/dor/services/suri_service.rb +6 -6
  61. data/lib/dor/services/technical_metadata_service.rb +27 -44
  62. data/lib/dor/utils/ng_tidy.rb +3 -3
  63. data/lib/dor/utils/sdr_client.rb +2 -3
  64. data/lib/dor/utils/solr_doc_helper.rb +1 -3
  65. data/lib/dor/version.rb +1 -1
  66. data/lib/dor/workflow/document.rb +43 -40
  67. data/lib/dor/workflow/graph.rb +26 -26
  68. data/lib/dor/workflow/process.rb +34 -35
  69. data/lib/tasks/rdoc.rake +5 -5
  70. metadata +129 -111
  71. data/lib/dor/models/presentable.rb +0 -146
@@ -5,8 +5,8 @@ module Dor
5
5
  has_metadata :name => 'events', :type => Dor::EventsDS, :label => 'Events'
6
6
  end
7
7
 
8
- def add_event *args
9
- self.datastreams['events'].add_event *args
8
+ def add_event(*args)
9
+ datastreams['events'].add_event *args
10
10
  end
11
11
  end
12
12
  end
@@ -13,16 +13,16 @@ module Dor
13
13
 
14
14
  # @return [String, nil] XML
15
15
  def fetch_geoMetadata_datastream
16
- candidates = self.datastreams['identityMetadata'].otherId.collect { |oid| oid.to_s }
16
+ candidates = datastreams['identityMetadata'].otherId.collect { |oid| oid.to_s }
17
17
  metadata_id = Dor::MetadataService.resolvable(candidates).first
18
18
  return nil if metadata_id.nil?
19
- return Dor::MetadataService.fetch(metadata_id.to_s)
19
+ Dor::MetadataService.fetch(metadata_id.to_s)
20
20
  end
21
21
 
22
22
  def build_geoMetadata_datastream(ds)
23
23
  content = fetch_geoMetadata_datastream
24
24
  return nil if content.nil?
25
- ds.dsLabel = self.label
25
+ ds.dsLabel = label
26
26
  ds.ng_xml = Nokogiri::XML(content)
27
27
  ds.ng_xml.normalize_text!
28
28
  ds.content = ds.ng_xml.to_xml
@@ -4,20 +4,20 @@ module Dor
4
4
  include Rightsable
5
5
 
6
6
  included do
7
- belongs_to :admin_policy_object, :property => :is_governed_by, :class_name => "Dor::AdminPolicyObject"
8
- has_and_belongs_to_many :collections, :property => :is_member_of_collection, :class_name => "Dor::Collection"
9
- has_and_belongs_to_many :sets, :property => :is_member_of, :class_name => "Dor::Collection"
7
+ belongs_to :admin_policy_object, :property => :is_governed_by, :class_name => 'Dor::AdminPolicyObject'
8
+ has_and_belongs_to_many :collections, :property => :is_member_of_collection, :class_name => 'Dor::Collection'
9
+ has_and_belongs_to_many :sets, :property => :is_member_of, :class_name => 'Dor::Collection'
10
10
  end
11
11
 
12
12
  def initiate_apo_workflow(name)
13
- self.initialize_workflow(name, !self.new_object?)
13
+ initialize_workflow(name, !self.new_object?)
14
14
  end
15
15
 
16
16
  # Returns the default lane_id from the item's APO. Will return 'default' if the item does not have
17
17
  # and APO, or if the APO does not have a default_lane
18
18
  # @return [String] the lane id
19
19
  def default_workflow_lane
20
- return 'default' if self.admin_policy_object.nil? # TODO log warning?
20
+ return 'default' if admin_policy_object.nil? # TODO: log warning?
21
21
 
22
22
  admin_md = admin_policy_object.datastreams['administrativeMetadata']
23
23
  return 'default' unless admin_md.respond_to? :default_workflow_lane
@@ -27,11 +27,11 @@ module Dor
27
27
  end
28
28
 
29
29
  def reset_to_apo_default
30
- self.rightsMetadata.content = admin_policy_object.rightsMetadata.ng_xml
30
+ rightsMetadata.content = admin_policy_object.rightsMetadata.ng_xml
31
31
  end
32
32
 
33
33
  def set_read_rights(rights)
34
- self.rightsMetadata.set_read_rights(rights)
34
+ rightsMetadata.set_read_rights(rights)
35
35
  end
36
36
 
37
37
  def add_collection(collection_or_druid)
@@ -41,12 +41,11 @@ module Dor
41
41
  when Dor::Collection
42
42
  collection_or_druid
43
43
  end
44
- self.collections << collection
45
- self.sets << collection
44
+ collections << collection
45
+ sets << collection
46
46
  end
47
47
 
48
48
  def remove_collection(collection_or_druid)
49
-
50
49
  collection = case collection_or_druid
51
50
  when String
52
51
  Dor::Collection.find(collection_or_druid)
@@ -54,17 +53,17 @@ module Dor
54
53
  collection_or_druid
55
54
  end
56
55
 
57
- self.collections.delete(collection)
58
- self.sets.delete(collection)
56
+ collections.delete(collection)
57
+ sets.delete(collection)
59
58
  end
60
- #set the rights metadata datastream to the content of the APO's default object rights
59
+ # set the rights metadata datastream to the content of the APO's default object rights
61
60
  def reapplyAdminPolicyObjectDefaults
62
- rightsMetadata.content=admin_policy_object.datastreams['defaultObjectRights'].content
61
+ rightsMetadata.content = admin_policy_object.datastreams['defaultObjectRights'].content
63
62
  end
64
63
  def rights
65
64
  return nil unless self.respond_to? :rightsMetadata
66
- return nil if self.rightsMetadata.nil?
67
- xml = self.rightsMetadata.ng_xml
65
+ return nil if rightsMetadata.nil?
66
+ xml = rightsMetadata.ng_xml
68
67
  return nil if xml.search('//rightsMetadata').length != 1 # ORLY?
69
68
  if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
70
69
  'Stanford'
@@ -100,31 +99,31 @@ module Dor
100
99
  def groups_which_view_metadata
101
100
  ['dor-administrator', 'sdr-administrator', 'dor-apo-manager', 'dor-apo-depositor', 'dor-viewer', 'sdr-viewer']
102
101
  end
103
- def intersect arr1, arr2
104
- return (arr1 & arr2).length > 0
102
+ def intersect(arr1, arr2)
103
+ (arr1 & arr2).length > 0
105
104
  end
106
- def can_manage_item? roles
105
+ def can_manage_item?(roles)
107
106
  intersect roles, groups_which_manage_item
108
107
  end
109
- def can_manage_desc_metadata? roles
108
+ def can_manage_desc_metadata?(roles)
110
109
  intersect roles, groups_which_manage_desc_metadata
111
110
  end
112
- def can_manage_system_metadata? roles
111
+ def can_manage_system_metadata?(roles)
113
112
  intersect roles, groups_which_manage_system_metadata
114
113
  end
115
- def can_manage_content? roles
114
+ def can_manage_content?(roles)
116
115
  intersect roles, groups_which_manage_content
117
116
  end
118
- def can_manage_rights? roles
117
+ def can_manage_rights?(roles)
119
118
  intersect roles, groups_which_manage_rights
120
119
  end
121
- def can_manage_embargo? roles
120
+ def can_manage_embargo?(roles)
122
121
  intersect roles, groups_which_manage_embargo
123
122
  end
124
- def can_view_content? roles
123
+ def can_view_content?(roles)
125
124
  intersect roles, groups_which_view_content
126
125
  end
127
- def can_view_metadata? roles
126
+ def can_view_metadata?(roles)
128
127
  intersect roles, groups_which_view_metadata
129
128
  end
130
129
  end
@@ -6,39 +6,39 @@ module Dor
6
6
  include Upgradable
7
7
 
8
8
  included do
9
- has_metadata :name => "DC", :type => SimpleDublinCoreDs, :label => 'Dublin Core Record for self object'
10
- has_metadata :name => "identityMetadata", :type => Dor::IdentityMetadataDS, :label => 'Identity Metadata'
9
+ has_metadata :name => 'DC', :type => SimpleDublinCoreDs, :label => 'Dublin Core Record for self object'
10
+ has_metadata :name => 'identityMetadata', :type => Dor::IdentityMetadataDS, :label => 'Identity Metadata'
11
11
  end
12
12
 
13
13
  module ClassMethods
14
14
  attr_reader :object_type
15
- def has_object_type str
15
+ def has_object_type(str)
16
16
  @object_type = str
17
17
  Dor.registered_classes[str] = self
18
18
  end
19
19
  end
20
20
 
21
- def initialize attrs={}
21
+ def initialize(attrs = {})
22
22
  if Dor::Config.suri.mint_ids && !attrs[:pid]
23
- attrs = attrs.merge!({:pid=>Dor::SuriService.mint_id, :new_object => true})
23
+ attrs = attrs.merge!({:pid => Dor::SuriService.mint_id, :new_object => true})
24
24
  end
25
25
  super
26
26
  end
27
27
 
28
28
  # helper method to get the tags as an array
29
29
  def tags
30
- self.identityMetadata.tag
30
+ identityMetadata.tag
31
31
  end
32
32
 
33
33
  # helper method to get just the content type tag
34
34
  def content_type_tag
35
- content_tag=tags.select {|tag| tag.include?('Process : Content Type')}
36
- content_tag.size == 1 ? content_tag[0].split(':').last.strip : ""
35
+ content_tag = tags.select {|tag| tag.include?('Process : Content Type')}
36
+ content_tag.size == 1 ? content_tag[0].split(':').last.strip : ''
37
37
  end
38
38
 
39
39
  # Syntactic sugar for identifying applied DOR Concerns
40
40
  # e.g., obj.is_identifiable? is the same as obj.is_a?(Dor::Identifiable)
41
- def method_missing sym, *args
41
+ def method_missing(sym, *args)
42
42
  if sym.to_s =~ /^is_(.+)\?$/
43
43
  begin
44
44
  klass = Dor.const_get $1.capitalize.to_sym
@@ -53,11 +53,11 @@ module Dor
53
53
 
54
54
  ## Module-level variables, shared between ALL mixin includers (and ALL *their* includers/extenders)!
55
55
  ## used for caching found values
56
- @@collection_hash={}
57
- @@apo_hash={}
56
+ @@collection_hash = {}
57
+ @@apo_hash = {}
58
58
 
59
- def to_solr(solr_doc=Hash.new, *args)
60
- self.assert_content_model
59
+ def to_solr(solr_doc = {}, *args)
60
+ assert_content_model
61
61
  super(solr_doc, *args)
62
62
 
63
63
  solr_doc[Dor::INDEX_VERSION_FIELD] = Dor::VERSION
@@ -66,24 +66,24 @@ module Dor
66
66
  add_solr_value(solr_doc, 'ds_specs', ds.datastream_spec_string, :string, [:symbol]) unless ds.new?
67
67
  end
68
68
 
69
- add_solr_value(solr_doc, 'title_sort', self.label, :string, [:stored_sortable])
69
+ add_solr_value(solr_doc, 'title_sort', label, :string, [:stored_sortable])
70
70
 
71
- rels_doc = Nokogiri::XML(self.datastreams['RELS-EXT'].content)
71
+ rels_doc = Nokogiri::XML(datastreams['RELS-EXT'].content)
72
72
  apos = rels_doc.search('//rdf:RDF/rdf:Description/hydra:isGovernedBy', 'hydra' => 'http://projecthydra.org/ns/relations#', 'fedora' => 'info:fedora/fedora-system:def/relations-external#', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
73
73
  collections = rels_doc.search('//rdf:RDF/rdf:Description/fedora:isMemberOfCollection', 'fedora' => 'info:fedora/fedora-system:def/relations-external#', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
74
- solrize_related_obj_titles(solr_doc, apos, @@apo_hash, "apo_title")
75
- solrize_related_obj_titles(solr_doc, collections, @@collection_hash, "collection_title")
74
+ solrize_related_obj_titles(solr_doc, apos, @@apo_hash, 'apo_title', 'nonhydrus_apo_title', 'hydrus_apo_title')
75
+ solrize_related_obj_titles(solr_doc, collections, @@collection_hash, 'collection_title', 'nonhydrus_collection_title', 'hydrus_collection_title')
76
76
 
77
- solr_doc["metadata_source_ssi"] = self.identity_metadata_source
78
- return solr_doc
77
+ solr_doc['metadata_source_ssi'] = identity_metadata_source
78
+ solr_doc
79
79
  end
80
80
 
81
81
  # @return [String] calculated value for Solr index
82
82
  def identity_metadata_source
83
- if self.identityMetadata.otherId('catkey').first ||
84
- self.identityMetadata.otherId('barcode').first
83
+ if identityMetadata.otherId('catkey').first ||
84
+ identityMetadata.otherId('barcode').first
85
85
  'Symphony'
86
- elsif self.identityMetadata.otherId('mdtoolkit').first
86
+ elsif identityMetadata.otherId('mdtoolkit').first
87
87
  'Metadata Toolkit'
88
88
  else
89
89
  'DOR'
@@ -91,26 +91,26 @@ module Dor
91
91
  end
92
92
 
93
93
  def set_source_id(source_id)
94
- self.identityMetadata.sourceId = source_id
94
+ identityMetadata.sourceId = source_id
95
95
  end
96
96
 
97
- def add_other_Id(type,val)
98
- if self.identityMetadata.otherId(type).length>0
99
- raise 'There is an existing entry for '+type+', consider using update_other_Id().'
97
+ def add_other_Id(type, val)
98
+ if identityMetadata.otherId(type).length > 0
99
+ raise 'There is an existing entry for ' + type + ', consider using update_other_Id().'
100
100
  end
101
- self.identityMetadata.add_otherId(type+':'+val)
101
+ identityMetadata.add_otherId(type + ':' + val)
102
102
  end
103
103
 
104
- def update_other_Id(type, new_val, val=nil)
105
- self.identityMetadata.ng_xml.search('//otherId[@name=\''+type+'\']')
106
- .select{ |node| val.nil? || node.content == val }
104
+ def update_other_Id(type, new_val, val = nil)
105
+ identityMetadata.ng_xml.search('//otherId[@name=\'' + type + '\']')
106
+ .select { |node| val.nil? || node.content == val }
107
107
  .each { |node| node.content = new_val }
108
108
  .any?
109
109
  end
110
110
 
111
- def remove_other_Id(type, val=nil)
112
- self.identityMetadata.ng_xml.search('//otherId[@name=\''+type+'\']')
113
- .select{ |node| val.nil? || node.content == val }
111
+ def remove_other_Id(type, val = nil)
112
+ identityMetadata.ng_xml.search('//otherId[@name=\'' + type + '\']')
113
+ .select { |node| val.nil? || node.content == val }
114
114
  .each(&:remove)
115
115
  .any?
116
116
  end
@@ -118,17 +118,17 @@ module Dor
118
118
  # turns a tag string into an array with one element per tag part.
119
119
  # split on ":", disregard leading and trailing whitespace on tokens.
120
120
  def split_tag_to_arr(tag_str)
121
- return tag_str.split(":").map {|str| str.strip}
121
+ tag_str.split(':').map {|str| str.strip}
122
122
  end
123
123
 
124
124
  # turn a tag array back into a tag string with a standard format
125
125
  def normalize_tag_arr(tag_arr)
126
- return tag_arr.join(' : ')
126
+ tag_arr.join(' : ')
127
127
  end
128
128
 
129
129
  # take a tag string and return a normalized tag string
130
130
  def normalize_tag(tag_str)
131
- return normalize_tag_arr(split_tag_to_arr(tag_str))
131
+ normalize_tag_arr(split_tag_to_arr(tag_str))
132
132
  end
133
133
 
134
134
  # take a proposed tag string and a list of the existing tags for the object being edited. if
@@ -145,7 +145,7 @@ module Dor
145
145
  raise "An existing tag (#{dupe_existing_tag}) is the same, consider using update_tag?"
146
146
  end
147
147
 
148
- return normalized_tag
148
+ normalized_tag
149
149
  end
150
150
 
151
151
  # Ensure that an administrative tag meets the proper mininum format
@@ -161,21 +161,21 @@ module Dor
161
161
  if tag_arr.detect {|str| str.empty?}
162
162
  raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' contains empty elements"
163
163
  end
164
- return tag_arr
164
+ tag_arr
165
165
  end
166
166
 
167
167
  # Add an administrative tag to an item, you will need to seperately save the item to write it to fedora
168
168
  # @param tag [string] The tag you wish to add
169
169
  def add_tag(tag)
170
- identity_metadata_ds = self.identityMetadata
171
- normalized_tag = validate_and_normalize_tag(tag, identity_metadata_ds.tags)
172
- identity_metadata_ds.add_value(:tag, normalized_tag)
170
+ identity_metadata_ds = identityMetadata
171
+ normalized_tag = validate_and_normalize_tag(tag, identity_metadata_ds.tags)
172
+ identity_metadata_ds.add_value(:tag, normalized_tag)
173
173
  end
174
174
 
175
175
  def remove_tag(tag)
176
176
  normtag = normalize_tag(tag)
177
- self.identityMetadata.ng_xml.search('//tag')
178
- .select{ |node| normalize_tag(node.content) == normtag }
177
+ identityMetadata.ng_xml.search('//tag')
178
+ .select { |node| normalize_tag(node.content) == normtag }
179
179
  .each(&:remove)
180
180
  .any?
181
181
  end
@@ -183,7 +183,7 @@ module Dor
183
183
  # Removes all displayTypes from an item in preparation of adding a new display type
184
184
  # @return Boolean True if displayTypes were removed, False if no displayTypes were removed
185
185
  def remove_displayTypes
186
- nodes = self.identityMetadata.ng_xml.search('//displayType')
186
+ nodes = identityMetadata.ng_xml.search('//displayType')
187
187
  # NOTE: .each after search is different than normal ruby enumerator:
188
188
  # ~ ng_xml.search('//nonexistant_tag').each(&:foo) == 0
189
189
  # ~ [].each(&:foo) == []
@@ -193,40 +193,51 @@ module Dor
193
193
 
194
194
  def update_tag(old_tag, new_tag)
195
195
  normtag = normalize_tag(old_tag)
196
- self.identityMetadata.ng_xml.search('//tag')
197
- .select{ |node| normalize_tag(node.content) == normtag }
196
+ identityMetadata.ng_xml.search('//tag')
197
+ .select { |node| normalize_tag(node.content) == normtag }
198
198
  .each { |node| node.content = normalize_tag(new_tag) }
199
199
  .any?
200
200
  end
201
201
 
202
202
  def get_related_obj_display_title(related_obj, default_title)
203
203
  if related_obj
204
- if related_obj.datastreams["DC"] && related_obj.datastreams["DC"].title
205
- return related_obj.datastreams["DC"].title
204
+ if related_obj.datastreams['DC'] && related_obj.datastreams['DC'].title
205
+ return related_obj.datastreams['DC'].title
206
206
  else
207
207
  return related_obj.label
208
208
  end
209
209
  end
210
210
 
211
- return default_title
211
+ default_title
212
212
  end
213
213
 
214
214
  private
215
- def solrize_related_obj_titles(solr_doc, relationships, title_hash, field_name)
215
+
216
+ def solrize_related_obj_titles(solr_doc, relationships, title_hash, union_field_name, nonhydrus_field_name, hydrus_field_name)
217
+ # TODO: if you wanted to get a little fancier, you could also solrize a 2 level hierarchy and display using hierarchial facets, like
218
+ # ["SOURCE", "SOURCE : TITLE"] (e.g. ["Hydrus", "Hydrus : Special Collections"], see (exploded) tags in IdentityMetadataDS#to_solr).
216
219
  title_type = :symbol # we'll get an _ssim because of the type
217
220
  title_attrs = [:stored_searchable] # we'll also get a _tesim from this attr
218
221
  relationships.each do |rel_node|
219
222
  rel_druid = rel_node['rdf:resource']
220
223
  next unless rel_druid # TODO: warning here would also be useful
221
224
  rel_druid = rel_druid.gsub('info:fedora/', '')
222
- if title_hash.key?(rel_druid)
223
- add_solr_value(solr_doc, field_name, title_hash[rel_druid], title_type, title_attrs)
224
- else
225
+
226
+ # populate cache if necessary
227
+ unless title_hash.key?(rel_druid)
225
228
  related_obj = Dor.find(rel_druid)
226
229
  related_obj_title = get_related_obj_display_title(related_obj, rel_druid)
227
- add_solr_value(solr_doc, field_name, related_obj_title, title_type, title_attrs)
228
- title_hash[rel_druid] = related_obj_title
230
+ is_from_hydrus = (related_obj && related_obj.tags.include?('Project : Hydrus'))
231
+ title_hash[rel_druid] = {'related_obj_title' => related_obj_title, 'is_from_hydrus' => is_from_hydrus}
232
+ end
233
+
234
+ # cache should definitely be populated, so just use that to write solr field
235
+ if title_hash[rel_druid]['is_from_hydrus']
236
+ add_solr_value(solr_doc, hydrus_field_name, title_hash[rel_druid]['related_obj_title'], title_type, title_attrs)
237
+ else
238
+ add_solr_value(solr_doc, nonhydrus_field_name, title_hash[rel_druid]['related_obj_title'], title_type, title_attrs)
229
239
  end
240
+ add_solr_value(solr_doc, union_field_name, title_hash[rel_druid]['related_obj_title'], title_type, title_attrs)
230
241
  end
231
242
  end
232
243
  end
@@ -11,7 +11,6 @@ module Dor
11
11
  include Contentable
12
12
  include Geoable
13
13
  include Releaseable
14
-
15
14
  end
16
15
 
17
16
  class Abstract < ::ActiveFedora::Base
@@ -6,18 +6,18 @@ module Dor
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- has_metadata :name => "contentMetadata", :type => Dor::ContentMetadataDS, :label => 'Content Metadata', :control_group => 'M'
9
+ has_metadata :name => 'contentMetadata', :type => Dor::ContentMetadataDS, :label => 'Content Metadata', :control_group => 'M'
10
10
  end
11
11
 
12
12
  DIFF_FILENAME = 'cm_inv_diff'
13
- DIFF_QUERY = DIFF_FILENAME.gsub('_', '-')
13
+ DIFF_QUERY = DIFF_FILENAME.tr('_', '-')
14
14
 
15
15
  # Deletes all cm_inv_diff files in the workspace for the Item
16
16
  def clear_diff_cache
17
17
  if Dor::Config.stacks.local_workspace_root.nil?
18
18
  raise ArgumentError, 'Missing Dor::Config.stacks.local_workspace_root'
19
19
  end
20
- druid = DruidTools::Druid.new(self.pid, Dor::Config.stacks.local_workspace_root)
20
+ druid = DruidTools::Druid.new(pid, Dor::Config.stacks.local_workspace_root)
21
21
  diff_pattern = File.join(druid.temp_dir, DIFF_FILENAME + '.*')
22
22
  FileUtils.rm_f Dir.glob(diff_pattern)
23
23
  end
@@ -31,7 +31,7 @@ module Dor
31
31
  if Dor::Config.stacks.local_workspace_root.nil?
32
32
  raise Dor::ParameterError, 'Missing Dor::Config.stacks.local_workspace_root'
33
33
  end
34
- unless %w{all shelve preserve publish}.include?(subset.to_s)
34
+ unless %w(all shelve preserve publish).include?(subset.to_s)
35
35
  raise Dor::ParameterError, "Invalid subset value: #{subset}"
36
36
  end
37
37
 
@@ -40,17 +40,16 @@ module Dor
40
40
  raise Dor::ParameterError, 'Missing Dor::Config.sdr.rest_client'
41
41
  end
42
42
  sdr_client = Dor::Config.sdr.rest_client
43
- current_content = self.datastreams['contentMetadata'].content
43
+ current_content = datastreams['contentMetadata'].content
44
44
  if current_content.nil?
45
- raise Dor::Exception, "Missing contentMetadata datastream"
45
+ raise Dor::Exception, 'Missing contentMetadata datastream'
46
46
  end
47
47
  query_string = { :subset => subset.to_s }
48
48
  query_string[:version] = version.to_s unless version.nil?
49
49
  query_string = URI.encode_www_form(query_string)
50
- sdr_query = "objects/#{self.pid}/#{DIFF_QUERY}?#{query_string}"
50
+ sdr_query = "objects/#{pid}/#{DIFF_QUERY}?#{query_string}"
51
51
  response = sdr_client[sdr_query].post(current_content, :content_type => 'application/xml')
52
52
  response
53
53
  end
54
-
55
54
  end
56
55
  end