class Geoloader::Services::Geonetwork

Attributes

resource[R]

Public Class Methods

new() click to toggle source

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
xml_doc() click to toggle source

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_group(group) click to toggle source

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
create_record(asset, style_sheet = "_none_", category = "_none_") click to toggle source

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(group) click to toggle source

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_record(asset) click to toggle source

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_record_by_id(id) click to toggle source

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_records_by_group(group) click to toggle source

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
ensure_group(group) click to toggle source

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_group(group) click to toggle source

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_group_id(group) click to toggle source

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
get_groups() click to toggle source

List all groups on the node.

# File lib/geoloader/services/geonetwork.rb, line 27
def get_groups
  @resource["xml.group.list"].get
end
get_ids_in_group(group) click to toggle source

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_record(asset) click to toggle source

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
group_exists?(group) click to toggle source

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(service, payload) click to toggle source

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
search_records_by_group(group) click to toggle source

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