class Ezid::ApiSession

Constants

APIVERSION
PRIVATE
PUBLIC
SCHEMES
SECURESERVER
TESTMETADATA
TESTPASSWORD
TESTSHOULDER
TESTUSERNAME
UNAVAIL
VERSION

Attributes

naa[RW]
password[RW]
scheme[R]
username[RW]

Public Class Methods

new(username = TESTUSERNAME, password = TESTPASSWORD, scheme = :ark, naa = '') click to toggle source
# File lib/ezid/apisession.rb, line 29
def initialize(username = TESTUSERNAME, password = TESTPASSWORD, scheme = :ark, naa = '')
  if username == TESTUSERNAME
    password = TESTPASSWORD
    @test = true
  else
    @test = false
  end

  @user = username
  @pass = password
  @scheme = SCHEMES[scheme]
  @naa = naa

  @naa = TESTSHOULDER[@scheme] if @test == true
  self
end

Public Instance Methods

build_identifier(identifier) click to toggle source
# File lib/ezid/apisession.rb, line 68
def build_identifier(identifier)
  unless identifier.start_with?(ApiSession::SCHEMES[:ark]) ||
      identifier.start_with?(ApiSession::SCHEMES[:doi])
    identifier = @scheme + @naa + identifier
  end
  identifier
end
create(identifier, metadata = {}) click to toggle source
# File lib/ezid/apisession.rb, line 56
def create(identifier, metadata = {})
  metadata = transform_metadata(metadata)
  request_uri = '/id/' + build_identifier(identifier)
  request = call_api(request_uri, :put, metadata)
  request.errored? ? request : get(request)
end
delete(identifier) click to toggle source
# File lib/ezid/apisession.rb, line 85
def delete(identifier)
  request_uri = '/id/' + identifier
  call_api(request_uri, :delete)
end
get(identifier) click to toggle source
# File lib/ezid/apisession.rb, line 76
def get(identifier)
  identifier = identifier.to_str
  identifier = identifier.split(' | ')[0] if identifier.include?('| ark:/')
  request_uri = '/id/' + identifier
  request = call_api(request_uri, :get)
  return request if request.errored?
  Ezid::Record.new(self, request.response['identifier'], request.response['metadata'], true)
end
mint(metadata = {}) click to toggle source
# File lib/ezid/apisession.rb, line 46
def mint(metadata = {})
  shoulder = @scheme + @naa
  metadata['_status'] = PRIVATE
  request_uri = "/shoulder/#{shoulder}"
  request = call_api(request_uri, :post, metadata)
  return request if request.errored?

  get(request)
end
record_modify(identifier, metadata, clear = false) click to toggle source

public utility methods

# File lib/ezid/apisession.rb, line 92
def record_modify(identifier, metadata, clear = false)
  if clear
    # TODO: clear old metadata
  end
  metadata.each do |name, value|
    modify(identifier, name, value)
  end
  get(identifier)
end
scheme=(scheme) click to toggle source
# File lib/ezid/apisession.rb, line 102
def scheme=(scheme)
  @scheme = SCHEMES[scheme]
  @naa = TESTSHOULDER[@scheme] if @test == true
  @scheme
end
transform_metadata(metadata) click to toggle source
# File lib/ezid/apisession.rb, line 63
def transform_metadata(metadata)
  metadata['_status'] = PRIVATE unless metadata['_status']
  metadata
end

Private Instance Methods

call_api(request_uri, request_method, request_data = nil) click to toggle source
# File lib/ezid/apisession.rb, line 110
def call_api(request_uri, request_method, request_data = nil)
  uri = URI(SECURESERVER + request_uri)

  # which HTTP method to use?
  if request_method == :get
    request = Net::HTTP::Get.new uri.request_uri
  elsif request_method == :put
    request = Net::HTTP::Put.new uri.request_uri
    request.body = make_anvl(request_data)
  elsif request_method == :post
    request = Net::HTTP::Post.new uri.request_uri
    request.body = make_anvl(request_data)
  elsif request_method == :delete
    request = Net::HTTP::Delete.new uri.request_uri
  end

  request.basic_auth @user, @pass
  request.add_field('Content-Type', 'text/plain; charset=UTF-8')

  # Make the call
  result = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
    parse_record http.request(request).body
  end
  Ezid::ServerResponse.new(result)
end
escape(s) click to toggle source
# File lib/ezid/apisession.rb, line 153
def escape(s)
  URI.escape(s, /[%:\n\r]/)
end
make_anvl(metadata) click to toggle source
# File lib/ezid/apisession.rb, line 152
def make_anvl(metadata)
  def escape(s)
    URI.escape(s, /[%:\n\r]/)
  end
  anvl = ''
  metadata.each do |n, v|
    anvl += escape(n.to_s) + ': ' + escape(v.to_s) + "\n"
  end
  # remove last newline. there is probably a really good way to
  # avoid adding it in the first place. if you know it, please fix.
  anvl.strip.encode!('UTF-8')
end
parse_record(ezid_response) click to toggle source
# File lib/ezid/apisession.rb, line 136
def parse_record(ezid_response)
  parts = ezid_response.split("\n")
  identifier = parts[0].split(': ')[1]
  metadata = {}
  if parts.length > 1
    parts[1..-1].each do |p|
      pair = p.split(': ')
      metadata[pair[0]] = pair[1]
    end
    record = { 'identifier' => identifier, 'metadata' => metadata }
  else
    record = identifier
  end
  record
end