lib/ddr/models/structure.rb in ddr-models-2.11.0 vs lib/ddr/models/structure.rb in ddr-models-3.0.0.alpha.1
- old
+ new
@@ -1,188 +1,52 @@
-module Ddr::Models
- #
- # Wraps a Nokogiri (XML) 'mets' Document
- #
- class Structure < SimpleDelegator
+module Ddr
+ module Models
+ #
+ # Wraps a Nokogiri (XML) Document
+ #
+ class Structure < SimpleDelegator
- # Indicates whether the structure is externally provided or maintained by the repository itself (i.e., is the
- # default structure for the object).
- EXTERNALLY_PROVIDED = 'provided'.freeze
- REPOSITORY_MAINTAINED = 'repository'.freeze
+ 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 as_xml_document
+ __getobj__
+ end
- def files
- @files ||= collect_files
- end
+ private
- def uses
- @uses ||= collect_uses
- end
-
- def structmap(type=nil)
- sm = type ? structMap_node(type) : structMap_nodes.first
- @structmap ||= Ddr::Models::Structures::StructMap.new(sm)
- end
-
- 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
+ def structMap_nodes
+ xpath("//xmlns:structMap")
end
- deref_struct
- end
- 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
+ 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
end
- files
- 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
+ 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
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
+end
\ No newline at end of file