Module: Dor::Describable

Extended by:
ActiveSupport::Concern
Included in:
Abstract
Defined in:
lib/dor/models/concerns/describable.rb

Defined Under Namespace

Classes: CrosswalkError

Constant Summary collapse

MODS_TO_DC_XSLT =
Nokogiri::XSLT(File.new(File.expand_path(File.dirname(__FILE__) + "/mods2dc.xslt")))
XMLNS_OAI_DC =
'http://www.openarchives.org/OAI/2.0/oai_dc/'
XMLNS_DC =
'http://purl.org/dc/elements/1.1/'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_collection_title(obj) ⇒ Object



89
90
91
# File 'lib/dor/models/concerns/describable.rb', line 89

def self.get_collection_title(obj)
  obj.full_title
end

Instance Method Details

#build_descMetadata_datastream(ds) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/dor/models/concerns/describable.rb', line 37

def (ds)
  content = 
  return nil if content.nil?

  ds.dsLabel = 'Descriptive Metadata'
  ds.ng_xml = Nokogiri::XML(content)
  ds.ng_xml.normalize_text!
  ds.content = ds.ng_xml.to_xml
end

#fetch_descMetadata_datastreamObject



31
32
33
34
35
# File 'lib/dor/models/concerns/describable.rb', line 31

def 
  candidates = datastreams['identityMetadata'].otherId.collect { |oid| oid.to_s }
   = Dor::MetadataService.resolvable(candidates).first
  .nil? ? nil : Dor::MetadataService.fetch(.to_s)
end

#full_titleObject



93
94
95
# File 'lib/dor/models/concerns/describable.rb', line 93

def full_title
  stanford_mods.sw_title_display
end

#generate_dublin_core(include_collection_as_related_item: true) ⇒ Nokogiri::Doc

Generates Dublin Core from the MODS in the descMetadata datastream using the LoC mods2dc stylesheet

Should not be used for the Fedora DC datastream

Returns:

  • (Nokogiri::Doc)

    the DublinCore XML document object

Raises:

  • (CrosswalkError)

    Raises an Exception if the generated DC is empty or has no children



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/dor/models/concerns/describable.rb', line 51

def generate_dublin_core(include_collection_as_related_item: true)
  desc_md = if include_collection_as_related_item
              Nokogiri::XML(generate_public_desc_md(include_access_conditions: false))
            else
              .ng_xml
            end

  dc_doc = MODS_TO_DC_XSLT.transform(desc_md)
  dc_doc.xpath('/oai_dc:dc/*[count(text()) = 0]', oai_dc: XMLNS_OAI_DC).remove # Remove empty nodes
  raise CrosswalkError, "Dor::Item#generate_dublin_core produced incorrect xml (no root):\n#{dc_doc.to_xml}" if dc_doc.root.nil?
  raise CrosswalkError, "Dor::Item#generate_dublin_core produced incorrect xml (no children):\n#{dc_doc.to_xml}" if dc_doc.root.children.size == 0

  dc_doc
end

#generate_public_desc_md(**options) ⇒ String

Returns Public descriptive medatada XML.

Returns:

  • (String)

    Public descriptive medatada XML



67
68
69
# File 'lib/dor/models/concerns/describable.rb', line 67

def generate_public_desc_md(**options)
  PublicDescMetadataService.new(self).to_xml(**options)
end

#set_desc_metadata_using_label(force = false) ⇒ String

Returns descMetadata.content XML.

Parameters:

  • force (Boolean) (defaults to: false)

    Overwrite existing XML

Returns:

  • (String)

    descMetadata.content XML



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/dor/models/concerns/describable.rb', line 73

def (force = false)
  unless force || .new?
    raise 'Cannot proceed, there is already content in the descriptive metadata datastream: ' + .content.to_s
  end

  label = self.label
  builder = Nokogiri::XML::Builder.new { |xml|
    xml.mods(Dor::DescMetadataDS::MODS_HEADER_CONFIG) {
      xml.titleInfo {
        xml.title label
      }
    }
  }
  .content = builder.to_xml
end

#stanford_mods(content = nil, ns_aware = true) ⇒ Object

intended for read-access, “as SearchWorks would see it”, mostly for to_solr()

Parameters:

  • content (Nokogiri::XML::Document) (defaults to: nil)

    Nokogiri descMetadata document (overriding internal data)

  • ns_aware (boolean) (defaults to: true)

    namespace awareness toggle for from_nk_node()



22
23
24
25
26
27
28
29
# File 'lib/dor/models/concerns/describable.rb', line 22

def stanford_mods(content = nil, ns_aware = true)
  @stanford_mods ||= begin
    m = Stanford::Mods::Record.new
    desc = content.nil? ? .ng_xml : content
    m.from_nk_node(desc.root, ns_aware)
    m
  end
end