class Libis::Ingester::MetsCreator
Public Instance Methods
add_children(mets, rep, div, item, ie_ingest_dir)
click to toggle source
# File lib/libis/ingester/tasks/mets_creator.rb, line 157 def add_children(mets, rep, div, item, ie_ingest_dir) item.divisions.each {|d| div << add_children(mets, rep, mets.div(label: d.name), d, ie_ingest_dir)} item.files.each {|f| div << add_file(mets, rep, f, ie_ingest_dir)} div end
add_file(mets, rep, item, ie_ingest_dir)
click to toggle source
# File lib/libis/ingester/tasks/mets_creator.rb, line 163 def add_file(mets, rep, item, ie_ingest_dir) config = item.to_hash properties = config.delete(:properties) config[:creation_date] = properties[:creation_time] config[:modification_date] = properties[:modification_time] config[:entity_type] = item.entity_type config[:location] = properties[:filename] # Workaround: review when Rosetta case #00552865 is fixed (then remove next line and remove transliteration and gsub again config[:original] = File.basename(properties[:original_path] || item.filepath) config[:target_location] = I18n.transliterate(properties[:original_path] || item.filepath).gsub(/[^a-zA-Z0-9\/.-]/,"_") # End workaround config[:mimetype] = properties[:mimetype] config[:size] = properties[:size] config[:puid] = properties[:puid] config[:checksum_MD5] = properties[:checksum_md5] config[:checksum_SHA1] = properties[:checksum_sha1] config[:checksum_SHA256] = properties[:checksum_sha256] config[:checksum_SHA384] = properties[:checksum_sha384] config[:checksum_SHA512] = properties[:checksum_sha512] config[:group_id] = properties[:group_id] config[:label] = item.label file = mets.file(config) file.representation = rep # copy file to stream stream_dir = File.join(ie_ingest_dir, 'content', 'streams') target_path = File.join(stream_dir, file.target) FileUtils.mkpath File.dirname(target_path) if File.exists?(target_path) unless Libis::Tools::Checksum.hexdigest(target_path, :MD5) == item.properties['checksum_md5'] raise Libis::WorkflowError, 'Target file (%s) already exists with different content.' % [target_path] end debug "File #{parameter(:copy_files) ? 'copy' : 'linking' } of #{item.fullpath} skipped." else if parameter(:copy_files) FileUtils.copy_entry(item.fullpath, target_path) debug "Copied file to #{target_path}.", item else FileUtils.symlink(item.fullpath, target_path) debug "Linked file to #{target_path}.", item end end # noinspection RubyResolve if item.metadata_record && item.metadata_record.format == 'DC' dc = Libis::Metadata::DublinCoreRecord.parse item.metadata_record.data file.dc_record = dc.root.to_xml end file end
add_rep(mets, item, ie_ingest_dir)
click to toggle source
# File lib/libis/ingester/tasks/mets_creator.rb, line 146 def add_rep(mets, item, ie_ingest_dir) rep = mets.representation(item.to_hash) rep.label = item.label div = mets.div label: item.parent.label mets.map(rep, div) add_children(mets, rep, div, item, ie_ingest_dir) end
create_ie(item)
click to toggle source
noinspection RubyResolve
# File lib/libis/ingester/tasks/mets_creator.rb, line 62 def create_ie(item) item.properties['ingest_sub_dir'] = "#{item._id}" item.save! mets = Libis::Tools::MetsFile.new dc_record = if item.metadata_record case item.metadata_record.format when 'DC' Libis::Metadata::DublinCoreRecord.new(item.metadata_record.data) else nil end else Libis::Metadata::DublinCoreRecord.new end if dc_record.title.text.blank? || parameter(:force_label_to_title) debug "Setting DC title to '#{item.label}'" dc_record.title = item.label end collection_list = item.ancestors.select do |i| i.is_a? Libis::Ingester::Collection end.map do |collection| collection.label end collection_list << parameter(:collection) if parameter(:collection) collection_list << parameter(:root_collection) if parameter(:root_collection) dc_record.isPartOf = collection_list.reverse.join('/') unless collection_list.empty? ingest_model = item.get_run.ingest_model dc_record.identifier! ingest_model.identifier if ingest_model.identifier mets.dc_record = dc_record.root.to_xml amd = { status: item.properties['status'] || ingest_model.status || 'ACTIVE', entity_type: item.properties['entity_type'] || ingest_model.entity_type, user_a: item.properties['user_a'] || ingest_model.user_a, user_b: item.properties['user_b'] || ingest_model.user_b, user_c: item.properties['user_c'] || ingest_model.user_c, } access_right = ingest_model.access_right if item.properties['access_right'] access_right = ::Libis::Ingester::AccessRight.find_by(name: item.properties['access_right']) end amd[:access_right] = access_right.ar_id if access_right retention_period = ingest_model.retention_period if item.properties['retention_period'] retention_period = ::Libis::Ingester::RetentionPeriod.find_by(name: item.properties['retention_period']) end amd[:retention_period] = retention_period.rp_id if retention_period amd[:collection_id] = item.parent.properties['collection_id'] if item.parent.is_a?(Libis::Ingester::Collection) mets.amd_info = amd ie_ingest_dir = File.join @ingest_dir, item.properties['ingest_sub_dir'] item.representations.each {|rep| add_rep(mets, rep, ie_ingest_dir)} mets_filename = File.join(ie_ingest_dir, 'content', "#{item.id}.xml") FileUtils.mkpath(File.dirname(mets_filename)) mets.xml_doc.save mets_filename sip_dc = Libis::Metadata::DublinCoreRecord.new do |xml| xml[:dc].title "#{item.get_run.name} - #{item.namepath}" xml[:dc].identifier item.get_run.name xml[:dc].source item.namepath xml[:dcterms].alternate item.label end sip_dc.save(File.join(ie_ingest_dir, 'content', 'dc.xml')) FileUtils.chmod_R 'a+rwX', ie_ingest_dir debug "Created METS file '#{mets_filename}'.", item end
create_item(item)
click to toggle source
noinspection RubyResolve
# File lib/libis/ingester/tasks/mets_creator.rb, line 49 def create_item(item) check_item_type Libis::Ingester::Item, item case item when Libis::Ingester::IntellectualEntity create_ie item else item.get_items.each {|i| create_item(i)} end end
pre_process(item)
click to toggle source
# File lib/libis/ingester/tasks/mets_creator.rb, line 31 def pre_process(item) skip_processing_item unless item.is_a? Libis::Ingester::IntellectualEntity end
process(item)
click to toggle source
# File lib/libis/ingester/tasks/mets_creator.rb, line 35 def process(item) unless @ingest_dir @ingest_dir = item.get_run.ingest_dir debug "Preparing ingest in #{@ingest_dir}.", item FileUtils.rmtree @ingest_dir FileUtils.mkpath @ingest_dir FileUtils.chmod 'a+rwX', @ingest_dir end create_ie(item) stop_processing_subitems end