Module: Dor::Identifiable

Extended by:
ActiveSupport::Concern
Includes:
Eventable, Upgradable, SolrDocHelper
Included in:
Abstract, AdminPolicyObject, Collection, Publishable, Set, WorkflowObject
Defined in:
lib/dor/models/identifiable.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

@@collection_hash =

Module-level variables, shared between ALL mixin includers (and ALL their includers/extenders)! used for caching found values

{}
@@apo_hash =
{}

Instance Method Summary collapse

Methods included from Upgradable

add_upgrade_callback, included, run_upgrade_callbacks, #upgrade!

Methods included from Eventable

#add_event

Methods included from SolrDocHelper

#add_solr_value

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args) ⇒ Object

Syntactic sugar for identifying applied DOR Concerns e.g., obj.is_identifiable? is the same as obj.is_a?(Dor::Identifiable)



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/dor/models/identifiable.rb', line 43

def method_missing sym, *args
  if sym.to_s =~ /^is_(.+)\?$/
    begin
      klass = Dor.const_get $1.capitalize.to_sym
      return self.is_a?(klass)
    rescue NameError
      return false
    end
  else
    super
  end
end

Instance Method Details

#add_other_Id(type, val) ⇒ Object



99
100
101
102
103
104
# File 'lib/dor/models/identifiable.rb', line 99

def add_other_Id(type,val)
  if self..otherId(type).length>0
    raise 'There is an existing entry for '+type+', consider using update_other_Id().'
  end
  self..add_otherId(type+':'+val)
end

#add_tag(tag) ⇒ Object

Add an administrative tag to an item, you will need to seperately save the item to write it to fedora

Parameters:

  • tag (string)

    The tag you wish to add



182
183
184
185
186
# File 'lib/dor/models/identifiable.rb', line 182

def add_tag(tag)
     = self.
    normalized_tag = validate_and_normalize_tag(tag, .tags)
    .add_value(:tag, normalized_tag)
end

#content_type_tagObject

helper method to get just the content type tag



36
37
38
39
# File 'lib/dor/models/identifiable.rb', line 36

def content_type_tag
  =tags.select {|tag| tag.include?('Process : Content Type')}
  .size == 1 ? [0].split(':').last.strip : ""
end


222
223
224
225
226
227
228
229
230
231
232
# File 'lib/dor/models/identifiable.rb', line 222

def get_related_obj_display_title(related_obj, default_title)
  if related_obj
    if related_obj.datastreams["DC"] && related_obj.datastreams["DC"].title
      return related_obj.datastreams["DC"].title
    else
      return related_obj.label
    end
  end

  return default_title
end

#identity_metadata_sourceString

Returns calculated value for Solr index.

Returns:

  • (String)

    calculated value for Solr index



84
85
86
87
88
89
90
91
92
93
# File 'lib/dor/models/identifiable.rb', line 84

def 
  if self..otherId('catkey').first ||
     self..otherId('barcode').first
    'Symphony'
  elsif self..otherId('mdtoolkit').first
    'Metadata Toolkit'
  else
    'DOR'
  end
end

#initialize(attrs = {}) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/dor/models/identifiable.rb', line 21

def initialize attrs={}
  if Dor::Config.suri.mint_ids
    unless attrs[:pid]
      attrs = attrs.merge!({:pid=>Dor::SuriService.mint_id, :new_object => true})
    end
  end
  super
end

#normalize_tag(tag_str) ⇒ Object

take a tag string and return a normalized tag string



140
141
142
# File 'lib/dor/models/identifiable.rb', line 140

def normalize_tag(tag_str)
  return normalize_tag_arr(split_tag_to_arr(tag_str))
end

#normalize_tag_arr(tag_arr) ⇒ Object

turn a tag array back into a tag string with a standard format



135
136
137
# File 'lib/dor/models/identifiable.rb', line 135

def normalize_tag_arr(tag_arr)
  return tag_arr.join(' : ')
end

#remove_displayTypesObject

Removes all displayTypes from an item in preparation of adding a new display type

Returns:

  • Boolean True if displayTypes were removed, False if no displayTypes were removed



202
203
204
205
206
207
208
209
# File 'lib/dor/models/identifiable.rb', line 202

def remove_displayTypes
  removed = false
  self..ng_xml.search('//displayType').each do |node|
      node.remove
      removed = true
  end
  return removed
end

#remove_other_Id(type, val = nil) ⇒ Object



117
118
119
120
121
122
123
124
125
126
# File 'lib/dor/models/identifiable.rb', line 117

def remove_other_Id(type, val=nil)
  removed=false
  self..ng_xml.search('//otherId[@name=\''+type+'\']').each do |node|
    if node.content===val || val.nil?
      node.remove
      removed=true
    end
  end
  return removed
end

#remove_tag(tag) ⇒ Object



188
189
190
191
192
193
194
195
196
197
# File 'lib/dor/models/identifiable.rb', line 188

def remove_tag(tag)
  removed = false
  self..ng_xml.search('//tag').each do |node|
    if normalize_tag(node.content) === normalize_tag(tag)
      node.remove
      removed = true
    end
  end
  return removed
end

#set_source_id(source_id) ⇒ Object



95
96
97
# File 'lib/dor/models/identifiable.rb', line 95

def set_source_id(source_id)
  self..sourceId = source_id
end

#split_tag_to_arr(tag_str) ⇒ Object

turns a tag string into an array with one element per tag part. split on “:”, disregard leading and trailing whitespace on tokens.



130
131
132
# File 'lib/dor/models/identifiable.rb', line 130

def split_tag_to_arr(tag_str)
  return tag_str.split(":").map {|str| str.strip}
end

#tagsObject

helper method to get the tags as an array



31
32
33
# File 'lib/dor/models/identifiable.rb', line 31

def tags
  self..tag
end

#to_solr(solr_doc = Hash.new, *args) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/dor/models/identifiable.rb', line 61

def to_solr(solr_doc=Hash.new, *args)
  self.assert_content_model
  super(solr_doc, *args)

  solr_doc[Dor::INDEX_VERSION_FIELD] = Dor::VERSION
  solr_doc['indexed_at_dtsi'] = Time.now.utc.xmlschema
  datastreams.values.each do |ds|
    add_solr_value(solr_doc, 'ds_specs', ds.datastream_spec_string, :string, [:symbol]) unless ds.new?
  end

  add_solr_value(solr_doc, 'title_sort', self.label, :string, [:stored_sortable])

  rels_doc = Nokogiri::XML(self.datastreams['RELS-EXT'].content)
  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#')
  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#')
  solrize_related_obj_titles(solr_doc, apos, @@apo_hash, "apo_title")
  solrize_related_obj_titles(solr_doc, collections, @@collection_hash, "collection_title")

  solr_doc["metadata_source_ssi"] = self.
  return solr_doc
end

#update_other_Id(type, new_val, val = nil) ⇒ Object



106
107
108
109
110
111
112
113
114
115
# File 'lib/dor/models/identifiable.rb', line 106

def update_other_Id(type, new_val, val=nil)
  updated=false
  self..ng_xml.search('//otherId[@name=\''+type+'\']').each do |node|
    if node.content==val || val.nil?
      node.content=new_val
      updated=true
    end
  end
  return updated
end

#update_tag(old_tag, new_tag) ⇒ Object



211
212
213
214
215
216
217
218
219
220
# File 'lib/dor/models/identifiable.rb', line 211

def update_tag(old_tag, new_tag)
  updated = false
  self..ng_xml.search('//tag').each do |node|
    if normalize_tag(node.content) == normalize_tag(old_tag)
      node.content = normalize_tag(new_tag)
      updated = true
    end
  end
  return updated
end

#validate_and_normalize_tag(tag_str, existing_tag_list) ⇒ Object

take a proposed tag string and a list of the existing tags for the object being edited. if the proposed tag is valid, return it in normalized form. if not, raise an exception with an explanatory message.



147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/dor/models/identifiable.rb', line 147

def validate_and_normalize_tag(tag_str, existing_tag_list)
  tag_arr = validate_tag_format(tag_str)

  # note that the comparison for duplicate tags is case-insensitive, but we don't change case as part of the normalized version
  # we return, because we want to preserve the user's intended case.
  normalized_tag = normalize_tag_arr(tag_arr)
  dupe_existing_tag = existing_tag_list.detect { |existing_tag| normalize_tag(existing_tag).downcase == normalized_tag.downcase }
  if dupe_existing_tag
    raise "An existing tag (#{dupe_existing_tag}) is the same, consider using update_tag?"
  end

  return normalized_tag
end

#validate_tag_format(tag_str) ⇒ Array

Ensure that an administrative tag meets the proper mininum format

Parameters:

  • tag_str (String)

    the tag

Returns:

  • (Array)

    the tag split into an array via ‘:’



166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/dor/models/identifiable.rb', line 166

def validate_tag_format(tag_str)
  tag_arr = split_tag_to_arr(tag_str)

  if tag_arr.length < 2
    raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' must have at least 2 elements"
  end

  if tag_arr.detect {|str| str.empty?}
    raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' contains empty elements"
  end
  return tag_arr
end