Class: Identifier::Global

Inherits:
Identifier
  • Object
show all
Includes:
Shared::DwcOccurrenceHooks, SoftValidation
Defined in:
app/models/identifier/global.rb

Overview

The identifier that is globally unique.

Curators of a specific project assert one canonical global identifier per type for each object, this identifier is identified by having .relation.nil?. If the curators feel there are multiple global identifiers for a given instance they must provide an explicit relationship between the canonical identifier and the alternate identifiers.

Defined Under Namespace

Classes: Doi, GenBankAccessionCode, Isbn, Issn, Lccn, Lsid, MorphbankSpecimenNumber, Orcid, Uri, Uuid, WebOfScience, Wikidata, ZoologicalRecord

Constant Summary

Constants included from SoftValidation

SoftValidation::ANCESTORS_WITH_SOFT_VALIDATIONS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from SoftValidation

#clear_soft_validations, #fix_for, #fix_soft_validations, #soft_fixed?, #soft_valid?, #soft_validate, #soft_validated?, #soft_validations, #soft_validators

Instance Attribute Details

#relation ⇒ String

Defines the relationship between the curator asserted canonical identifier and other identifiers of the same type. Must be provided for every global identifier of the same type beyond the first. Relations are drawn from skos (http://www.w3.org/TR/skos-reference/#mapping)

Returns:

  • (String)


14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/models/identifier/global.rb', line 14

class Identifier::Global < Identifier

  include SoftValidation

  # Only implemented for a couple, but for now DRYer to keep here
  include Shared::DwcOccurrenceHooks

  validates :namespace_id, absence: true
 
  # DEPRECATED: unused in 10 years, benefit seems doubtful.
  validates :relation, inclusion: {in: ::SKOS_RELATIONS.keys}, allow_nil: true

  # Identifier can only be used once, i.e. mapped to a single TW concept
  validates_uniqueness_of :identifier, scope: [:project_id]

  soft_validate(:sv_resolves?, set: :resolved)

  def is_global?
    true
  end

  def dwc_occurrences

    return DwcOccurrence.none unless %w{
     Identifier::Global::Wikidata
     Identifier::Global::Orcid
    }.include?(type)

    return DwcOccurrence.none unless identifier_object.is_a?(Person) || identifier_object.is_a?(Organization)

    Shared::DwcRoleAgent.occurrences_for(identifier_object)
  end

  protected

  def build_cached
    identifier
  end

  # TODO: add a resolution method so that this works on theings like wikidata Q numbers
  def sv_resolves?
    responded = identifier.present? && (Utilities::Net.resolves?(identifier) rescue false)
    soft_validations.add(:identifier, "Identifier '#{identifier}' does not resolve.") unless responded
    responded
  end

end

Instance Method Details

#build_cached ⇒ Object (protected)



49
50
51
# File 'app/models/identifier/global.rb', line 49

def build_cached
  identifier
end

#dwc_occurrences ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# File 'app/models/identifier/global.rb', line 35

def dwc_occurrences

  return DwcOccurrence.none unless %w{
   Identifier::Global::Wikidata
   Identifier::Global::Orcid
  }.include?(type)

  return DwcOccurrence.none unless identifier_object.is_a?(Person) || identifier_object.is_a?(Organization)

  Shared::DwcRoleAgent.occurrences_for(identifier_object)
end

#is_global? ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
# File 'app/models/identifier/global.rb', line 31

def is_global?
  true
end

#sv_resolves? ⇒ Boolean (protected)

TODO: add a resolution method so that this works on theings like wikidata Q numbers

Returns:

  • (Boolean)


54
55
56
57
58
# File 'app/models/identifier/global.rb', line 54

def sv_resolves?
  responded = identifier.present? && (Utilities::Net.resolves?(identifier) rescue false)
  soft_validations.add(:identifier, "Identifier '#{identifier}' does not resolve.") unless responded
  responded
end