class Geoloader::Services::Geonetwork
Attributes
Public Class Methods
Initialize the API wrapper.
# File lib/geoloader/services/geonetwork.rb, line 16 def initialize @resource = RestClient::Resource.new(Geoloader.config.geonetwork.url, { :user => Geoloader.config.geonetwork.username, :password => Geoloader.config.geonetwork.password, :headers => { :content_type => :xml } }) end
Get an XML builder instance.
# File lib/geoloader/services/geonetwork.rb, line 192 def self.xml_doc xml = Builder::XmlMarkup.new xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" xml end
Public Instance Methods
Create a new group with a given name.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 63 def create_group(group) post("group.update", self.class.xml_doc.request { |r| r.name group }) end
Insert a new record.
@param [Geoloader::Asset] asset @param [String] style_sheet @param [String] category
# File lib/geoloader/services/geonetwork.rb, line 108 def create_record(asset, style_sheet = "_none_", category = "_none_") delete_record(asset) post("metadata.insert", self.class.xml_doc.request { |r| r.group get_group_id(asset.workspace) r.data { |d| d.cdata! asset.iso19139_xml } r.category category r.styleSheet style_sheet }) end
Delete group with a given name.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 94 def delete_group(group) delete_records_by_group(group) post("group.remove", self.class.xml_doc.request { |r| r.id get_group_id(group) }) end
Delete the metadata record for an asset.
@param [Geoloader::Asset] asset
# File lib/geoloader/services/geonetwork.rb, line 145 def delete_record(asset) post("metadata.delete", self.class.xml_doc.request { |r| r.uuid asset.uuid }) rescue nil # Geonetwork 500's if the record doesn't exist... end
Delete a record by id.
@param [Integer] id
# File lib/geoloader/services/geonetwork.rb, line 156 def delete_record_by_id(id) post("metadata.delete", self.class.xml_doc.request { |r| r.id id }) end
Delete all records in a group with a given name.
@param [Integer] group
# File lib/geoloader/services/geonetwork.rb, line 167 def delete_records_by_group(group) get_ids_in_group(group).each do |id| delete_record_by_id(id) end end
Check to see if a group exists, and if not, create it.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 74 def ensure_group(group) create_group(group) unless group_exists?(group) end
Get a group with a given name.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 36 def get_group(group) Nokogiri::XML(get_groups).at_xpath("//record[name[text()='#{group}']]") end
Get the id of a group with a given name.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 54 def get_group_id(group) get_group(group).at_xpath("id").content.to_i end
List all groups on the node.
# File lib/geoloader/services/geonetwork.rb, line 27 def get_groups @resource["xml.group.list"].get end
Get a list of the ids of all records in a group.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 83 def get_ids_in_group(group) Nokogiri::XML(search_records_by_group(group)).xpath("//metadata//id").map do |m| m.content.to_i end end
Get the metadata record for an asset.
@param [Geoloader::Asset] asset
# File lib/geoloader/services/geonetwork.rb, line 123 def get_record(asset) post("xml.metadata.get", self.class.xml_doc.request { |r| r.uuid asset.uuid }) end
Does a group with a given name exist?
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 45 def group_exists?(group) !!get_group(group) end
POST to an XML service.
@param [String] service @param [String] payload
# File lib/geoloader/services/geonetwork.rb, line 179 def post(service, payload) @resource[service].post(payload) { |response, request, result, &block| if [301, 302, 307].include?(response.code) response.follow_redirection(request, result, &block) else response.return!(request, result, &block) end } end
Get all records in a given group.
@param [String] group
# File lib/geoloader/services/geonetwork.rb, line 134 def search_records_by_group(group) post("xml.search", self.class.xml_doc.request { |r| r.group get_group_id(group) }) end