lib/ddr/models/structure.rb in ddr-models-2.6.2 vs lib/ddr/models/structure.rb in ddr-models-2.7.0.rc1

- old
+ new

@@ -1,56 +1,183 @@ -module Ddr - module Models - # - # Wraps a Nokogiri (XML) Document - # - class Structure < SimpleDelegator +module Ddr::Models + # + # Wraps a Nokogiri (XML) 'mets' Document + # + class Structure < SimpleDelegator - def initialize(xml_doc=nil) - super - end + TYPE_DEFAULT = 'default'.freeze - def struct_maps - @struct_maps ||= build_struct_maps(structMap_nodes) - end + # Based on the PCDM Extension 'Use' ontology -- https://github.com/duraspace/pcdm/blob/master/pcdm-ext/use.rdf + USE_EXTRACTED_TEXT = 'ExtractedText'.freeze + USE_INTERMEDIATE_FILE = 'IntermediateFile'.freeze + USE_ORIGINAL_FILE = 'OriginalFile'.freeze + USE_PRESERVATION_MASTER_FILE = 'PreservationMasterFile'.freeze + USE_SERVICE_FILE = 'ServiceFile'.freeze + USE_THUMBNAIL_IMAGE = 'ThumbnailImage'.freeze + USE_TRANSCRIPT = 'Transcript'.freeze - def structMap_node(type='default') - xpath("//xmlns:structMap[@TYPE='#{type}']").first - end + def filesec + @filesec ||= Ddr::Models::Structures::FileSec.new(fileSec_node) + end - def fptr_nodes(type='default') - structMap_node(type).xpath('//xmlns:fptr') - end + def files + @files ||= collect_files + end - def as_xml_document - __getobj__ - end + def uses + @uses ||= collect_uses + end - private + def structmap(type=nil) + sm = type ? structMap_node(type) : structMap_nodes.first + @structmap ||= Ddr::Models::Structures::StructMap.new(sm) + end - def structMap_nodes - xpath("//xmlns:structMap") + def structmaps + @structmaps ||= structMap_nodes.map { |sm| Ddr::Models::Structures::StructMap.new(sm) } + end + + def metshdr + @metshdr ||= Ddr::Models::Structures::MetsHdr.new(metsHdr_node) + end + + def creator + @creator ||= metshdr.empty? ? nil + : Ddr::Models::Structures::MetsHdr.new(metsHdr_node).agents.first.name + end + + def repository_maintained? + creator == Ddr::Models::Structures::Agent::NAME_REPOSITORY_DEFAULT + end + + def dereferenced_structure + deref_struct = {} + structmaps.each do |sm| + deref_struct[sm.type] = sm.dereferenced_hash end + deref_struct + end - def build_struct_maps(structMap_nodes) - smaps = {} - structMap_nodes.each do |structMap_node| - type = structMap_node['TYPE'] || 'default' - raise StandardError, "Multiple '#{type}' structMaps" if smaps[type].present? - smaps[type] = Ddr::Models::StructDiv.new(structMap_node) - end - smaps + def as_xml_document + __getobj__ + end + + def add_metshdr(id:nil, createdate:nil, lastmoddate:nil, recordstatus:nil) + metshdr = Ddr::Models::Structures::MetsHdr.build(id: id, createdate: createdate, lastmoddate: lastmoddate, + recordstatus: recordstatus, document: as_xml_document) + root.add_child(metshdr) + metshdr + end + + def add_agent(parent:, id:nil, role:, otherrole:nil, type:nil, othertype:nil, name:nil) + agent = Ddr::Models::Structures::Agent.build(id: id, role: role, otherrole: otherrole, type: type, + othertype: othertype, name: name, document: as_xml_document) + parent.add_child(agent) + agent + end + + def add_filesec(id:nil) + filesec = Ddr::Models::Structures::FileSec.build(id: id, document: as_xml_document) + root.add_child(filesec) + filesec + end + + def add_filegrp(parent:, id:nil, use:nil) + filegrp = Ddr::Models::Structures::FileGrp.build(id: id, use: use, document: as_xml_document) + parent.add_child(filegrp) + filegrp + end + + def add_file(parent:, id:SecureRandom.uuid, use:nil) + file = Ddr::Models::Structures::File.build(id: id, use: use, document: as_xml_document) + parent.add_child(file) + file + end + + def add_flocat(parent:, id:nil, loctype:'ARK', otherloctype: nil, use:nil, href:) + flocat = Ddr::Models::Structures::FLocat.build(id: id, loctype: loctype, otherloctype: otherloctype, use: use, + href: href, document: as_xml_document) + parent.add_child(flocat) + flocat + end + + def add_structmap(id:nil, label:nil, type:) + structmap = Ddr::Models::Structures::StructMap.build(id: id, label: label, type: type, document: as_xml_document) + root.add_child(structmap) + structmap + end + + def add_div(parent:, id:nil, label:nil, order:nil, orderlabel: nil, type:nil) + div = Ddr::Models::Structures::Div.build(id: id, label: label, order:order, orderlabel: orderlabel, type: type, + document: as_xml_document) + parent.add_child(div) + div + end + + def add_fptr(parent:, id: nil, fileid:) + fptr = Ddr::Models::Structures::Fptr.build(id: id, fileid: fileid, document: as_xml_document) + parent.add_child(fptr) + fptr + end + + def add_mptr(parent:, id: nil, loctype:'ARK', otherloctype: nil, href:) + mptr = Ddr::Models::Structures::Mptr.build(id: id, loctype: loctype, otherloctype: otherloctype, href: href, + document: as_xml_document) + parent.add_child(mptr) + mptr + end + + private + + def fileSec_node + xpath("//xmlns:fileSec").first + end + + def structMap_nodes + xpath("//xmlns:structMap") + end + + def structMap_node(type) + xpath("//xmlns:structMap[@TYPE='#{type}']").first + end + + def metsHdr_node + xpath("//xmlns:metsHdr") + end + + def file_nodes + xpath("//xmlns:file") + end + + def flocat_nodes + xpath("//xmlns:FLocat") + end + + def collect_files + files = {} + file_nodes.each do |file_node| + file = Ddr::Models::Structures::File.new(file_node) + files[file.id] = file end + files + end - def self.template - Nokogiri::XML( - '<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink"> - <structMap TYPE="default" /> - </mets>' - ) do |config| - config.noblanks - end + def collect_uses + uses = {} + flocat_nodes.each do |flocat_node| + flocat = Ddr::Models::Structures::FLocat.new(flocat_node) + uses[flocat.effective_use] ||= [] + uses[flocat.effective_use] << flocat end + uses + end + def self.xml_template + Nokogiri::XML( + '<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink" />' + ) do |config| + config.noblanks + end end + end end