require 'dor/datastreams/content_metadata_ds'
module Dor
module Publishable
extend ActiveSupport::Concern
include Identifiable
include Governable
include Describable
include Itemizable
include Presentable
include Rightsable
def public_relationships
include_elements = ['fedora:isMemberOf','fedora:isMemberOfCollection']
rels_doc = Nokogiri::XML(self.datastreams['RELS-EXT'].content)
rels_doc.xpath('/rdf:RDF/rdf:Description/*', { 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' }).each do |rel|
unless include_elements.include?([rel.namespace.prefix,rel.name].join(':'))
rel.next_sibling.remove if rel.next_sibling.content.strip.empty?
rel.remove
end
end
rels_doc
end
#Generate the public .xml for a PURL page.
#@return [xml] The public xml for the item
#
def public_xml
pub = Nokogiri::XML("").root
pub['id'] = pid
pub['published'] = Time.now.xmlschema
release_xml=Nokogiri(self.generate_release_xml).xpath('//release')
im=self.datastreams['identityMetadata'].ng_xml.clone
im.search('//release').each {|node| node.remove} # remove any tags from public xml which have full history
im.root.add_child(release_xml)
pub.add_child(im.root) # add in modified identityMetadata datastream
pub.add_child(self.datastreams['contentMetadata'].public_xml.root.clone)
pub.add_child(self.datastreams['rightsMetadata'].ng_xml.root.clone)
rels = public_relationships.root
pub.add_child(rels.clone) unless rels.nil? # TODO: Should never be nil in practice; working around an ActiveFedora quirk for testing
pub.add_child(self.generate_dublin_core.root.clone)
@public_xml_doc = pub # save this for possible IIIF Presentation manifest
pub.add_child(Nokogiri(self.generate_release_xml).root.clone) unless release_xml.children.size == 0 #If there are no release_tags, this prevents an empty from being added
#Note we cannot base this on if an individual object has release tags or not, because the collection may cause one to be generated for an item, so we need to calculate it and then look at the final result
new_pub = Nokogiri::XML(pub.to_xml) { |x| x.noblanks }
new_pub.encoding = 'UTF-8'
new_pub.to_xml
end
# Copies this object's public_xml to the Purl document cache if it is world discoverable
# otherwise, it prunes the object's metadata from the document cache
def publish_metadata
rights = datastreams['rightsMetadata'].ng_xml.clone.remove_namespaces!
if(rights.at_xpath("//rightsMetadata/access[@type='discover']/machine/world"))
dc_xml = self.generate_dublin_core.to_xml {|config| config.no_declaration}
DigitalStacksService.transfer_to_document_store(pid, dc_xml, 'dc')
DigitalStacksService.transfer_to_document_store(pid, self.datastreams['identityMetadata'].to_xml, 'identityMetadata')
DigitalStacksService.transfer_to_document_store(pid, self.datastreams['contentMetadata'].to_xml, 'contentMetadata')
DigitalStacksService.transfer_to_document_store(pid, self.datastreams['rightsMetadata'].to_xml, 'rightsMetadata')
DigitalStacksService.transfer_to_document_store(pid, public_xml, 'public')
if self.metadata_format == 'mods'
DigitalStacksService.transfer_to_document_store(pid, self.generate_public_desc_md, 'mods')
end
if iiif_presentation_manifest_needed? @public_xml_doc
DigitalStacksService.transfer_to_document_store(pid, build_iiif_manifest(@public_xml_doc), 'manifest')
end
else
# Clear out the document cache for this item
DigitalStacksService.prune_purl_dir pid
end
end
#call the dor services app to have it publish the metadata
def publish_metadata_remotely
dor_services = RestClient::Resource.new(Config.dor_services.url+"/v1/objects/#{pid}/publish")
dor_services.post ''
dor_services.url
end
end
end