lib/ezid/client.rb in ezid-client-0.11.0 vs lib/ezid/client.rb in ezid-client-0.12.0
- old
+ new
@@ -1,16 +1,16 @@
-require "uri"
+require "net/http"
require_relative "configuration"
-require_relative "request"
-require_relative "response"
require_relative "session"
require_relative "metadata"
require_relative "identifier"
require_relative "error"
-require_relative "status"
+Dir[File.expand_path("../responses/*.rb", __FILE__)].each { |m| require m }
+Dir[File.expand_path("../requests/*.rb", __FILE__)].each { |m| require m }
+
module Ezid
#
# EZID client
#
# @api public
@@ -40,29 +40,28 @@
def version
"ezid-client #{VERSION} (EZID API Version #{API_VERSION})"
end
end
- attr_reader :session, :user, :password, :host, :use_ssl
+ attr_reader :user, :password, :host, :port, :use_ssl
def initialize(opts = {})
- @session = Session.new
@host = opts[:host] || config.host
- @use_ssl = opts.fetch(:use_ssl, config.use_ssl)
+ @port = (opts[:port] || config.port).to_i
+ @use_ssl = opts[:use_ssl] || config.use_ssl
@user = opts[:user] || config.user
- raise Error, "User name is required." unless user
@password = opts[:password] || config.password
- raise Error, "Password is required." unless password
if block_given?
login
yield self
logout
end
end
def inspect
- "#<#{self.class.name} host=\"#{host}\" user=\"#{user}\" session=#{logged_in? ? 'OPEN' : 'CLOSED'}>"
+ "#<#{self.class.name} connection=#{connection.inspect} " \
+ "user=\"#{user}\" session=#{logged_in? ? 'OPEN' : 'CLOSED'}>"
end
# The client configuration
# @return [Ezid::Configuration] the configuration object
def config
@@ -73,32 +72,34 @@
# @return [Logger] the logger
def logger
@logger ||= config.logger
end
+ # The client session
+ # @return [Ezid::Session] the session
+ def session
+ @session ||= Session.new
+ end
+
# Open a session
# @raise [Ezid::Error]
# @return [Ezid::Client] the client
def login
if logged_in?
logger.info("Already logged in, skipping login request.")
else
- response = Request.execute(:Get, build_uri("/login")) do |request|
- add_authentication(request)
- end
- handle_response(response, "LOGIN")
+ response = execute LoginRequest
session.open(response.cookie)
end
self
end
# Close the session
# @return [Ezid::Client] the client
def logout
if logged_in?
- response = Request.execute(:Get, build_uri("/logout"))
- handle_response(response, "LOGOUT")
+ execute LogoutRequest
session.close
else
logger.info("Not logged in, skipping logout request.")
end
self
@@ -107,104 +108,97 @@
# @return [true, false] whether the client is logged in
def logged_in?
session.open?
end
+ # Create an identifier (PUT an existing identifier)
+ # @see http://ezid.cdlib.org/doc/apidoc.html#operation-create-identifier
# @param identifier [String] the identifier string to create
# @param metadata [String, Hash, Ezid::Metadata] optional metadata to set
# @raise [Ezid::Error]
# @return [Ezid::Response] the response
def create_identifier(identifier, metadata=nil)
- response = Request.execute(:Put, build_uri("/id/#{identifier}")) do |request|
- add_authentication(request)
- add_metadata(request, metadata)
- end
- handle_response(response, "CREATE #{identifier}")
+ execute CreateIdentifierRequest, identifier, metadata
end
+ # Mint an identifier
+ # @see http://ezid.cdlib.org/doc/apidoc.html#operation-mint-identifier
# @param shoulder [String] the shoulder on which to mint a new identifier
# @param metadata [String, Hash, Ezid::Metadata] metadata to set
# @raise [Ezid::Error]
# @return [Ezid::Response] the response
def mint_identifier(shoulder=nil, metadata=nil)
shoulder ||= config.default_shoulder
raise Error, "Shoulder missing -- cannot mint identifier." unless shoulder
- response = Request.execute(:Post, build_uri("/shoulder/#{shoulder}")) do |request|
- add_authentication(request)
- add_metadata(request, metadata)
- end
- handle_response(response, "MINT #{shoulder}")
+ execute MintIdentifierRequest, shoulder, metadata
end
+ # Modify an identifier
+ # @see http://ezid.cdlib.org/doc/apidoc.html#operation-modify-identifier
# @param identifier [String] the identifier to modify
# @param metadata [String, Hash, Ezid::Metadata] metadata to set
# @raise [Ezid::Error]
# @return [Ezid::Response] the response
def modify_identifier(identifier, metadata)
- response = Request.execute(:Post, build_uri("/id/#{identifier}")) do |request|
- add_authentication(request)
- add_metadata(request, metadata)
- end
- handle_response(response, "MODIFY #{identifier}")
+ execute ModifyIdentifierRequest, identifier, metadata
end
+ # Get the metadata for an identifier
+ # @see http://ezid.cdlib.org/doc/apidoc.html#operation-get-identifier-metadata
# @param identifier [String] the identifier to retrieve
# @raise [Ezid::Error]
# @return [Ezid::Response] the response
def get_identifier_metadata(identifier)
- response = Request.execute(:Get, build_uri("/id/#{identifier}")) do |request|
- add_authentication(request)
- end
- handle_response(response, "GET #{identifier}")
+ execute GetIdentifierMetadataRequest, identifier
end
+ # Delete an identifier (only reserved identifier can be deleted)
+ # @see http://ezid.cdlib.org/doc/apidoc.html#operation-delete-identifier
# @param identifier [String] the identifier to delete
# @raise [Ezid::Error]
# @return [Ezid::Response] the response
def delete_identifier(identifier)
- response = Request.execute(:Delete, build_uri("/id/#{identifier}")) do |request|
- add_authentication(request)
- end
- handle_response(response, "DELETE #{identifier}")
+ execute DeleteIdentifierRequest, identifier
end
+ # Get the EZID server status (and the status of one or more subsystems)
+ # @see http://ezid.cdlib.org/doc/apidoc.html#server-status
# @param subsystems [Array]
# @raise [Ezid::Error]
- # @return [Ezid::Status] the status response
+ # @return [Ezid::StatusResponse] the status response
def server_status(*subsystems)
- response = Request.execute(:Get, build_uri("/status?subsystems=#{subsystems.join(',')}"))
- handle_response(Status.new(response), "STATUS")
+ execute ServerStatusRequest, *subsystems
end
+ # The Net::HTTP object used to connect to EZID
+ # @return [Net::HTTP] the connection
+ def connection
+ @connection ||= build_connection
+ end
+
private
- def build_uri(path)
- scheme = use_ssl ? "https" : "http"
- URI([scheme, "://", host, path].join)
- end
+ def use_ssl?
+ use_ssl || port == 443
+ end
- # Adds authentication data to the request
- def add_authentication(request)
- if session.open?
- request["Cookie"] = session.cookie
- else
- request.basic_auth(user, password)
- end
- end
+ def build_connection
+ conn = Net::HTTP.new(host, port)
+ conn.use_ssl = use_ssl?
+ conn
+ end
- # Adds EZID metadata (if any) to the request body
- def add_metadata(request, metadata)
- return if metadata.nil? || metadata.empty?
- metadata = Metadata.new(metadata) unless metadata.is_a?(Metadata)
- request.body = metadata.to_anvl(false)
- end
+ def handle_response(response, request_name)
+ log_level = response.error? ? Logger::ERROR : Logger::INFO
+ message = "EZID #{request_name} -- #{response.status_line}"
+ logger.log(log_level, message)
+ raise response.exception if response.exception
+ response
+ end
- def handle_response(response, request_info)
- log_level = response.error? ? Logger::ERROR : Logger::INFO
- message = "EZID #{request_info} -- #{response.status_line}"
- logger.log(log_level, message)
- raise response.exception if response.exception
- response
- end
+ def execute(request_class, *args)
+ response = request_class.execute(self, *args)
+ handle_response(response, request_class.short_name)
+ end
end
end