lib/libis/services/oai.rb in libis-services-1.0.10 vs lib/libis/services/oai.rb in libis-services-1.0.11
- old
+ new
@@ -1,24 +1,34 @@
require 'oai'
require 'libis/tools/extend/hash'
+require 'libis/tools/xml_document'
require 'libis/services/service_error'
module Libis
module Services
class Oai
include OAI::XPath
class Query
- attr_accessor :from, :until, :set, :metadata_prefix
- def intialize(metadata_prefix = 'oai_dc')
- @from = @until = @set = nil
- @metadata_prefix = metadata_prefix
+ def initialize(options = {})
+ @options = options
+ @options[:metadata_prefix] ||= 'oai_dc'
end
+ def [](key, value)
+ @options[key] = value
+ end
+
def to_hash
- { from: @from, until: @until, metadata_prefix: @metadata_prefix, set: @set }.cleanup
+ {
+ from: @options[:from],
+ until: @options[:until],
+ metadata_prefix: @options[:metadata_prefix],
+ set: @options[:set],
+ resumption_token: @options[:token] || @options[:resumption_token]
+ }.cleanup
end
end
def initialize(url, options = {})
@@ -33,32 +43,45 @@
def sets(token = nil)
options = { resumption_token: token }
do_oai_request(:list_sets, options)
end
- def metdata_formats(identifier = nil)
+ def metadata_formats(identifier = nil)
do_oai_request(:list_metadata_formats, {identifier: identifier})
end
- def identifiers(token = nil, query = Query.new)
- options = token ? {resumption_token: token} : query.to_hash
- do_oai_request(:list_identifiers, options)
+ def identifiers(token_or_query = nil)
+ do_oai_request(:list_identifiers, token_or_query_to_hash(token_or_query))
end
- def records(token = nil, query = Query.new)
- options = token ? {resumption_token: token} : query.to_hash
- do_oai_request(:list_records, options)
+ def records(token_or_query = nil)
+ do_oai_request(:list_records, token_or_query_to_hash(token_or_query))
end
- def record(identifier, metadata_prefix)
+ def record(identifier, metadata_prefix = 'oai_dc')
do_oai_request(:get_record, identifier: identifier, metadata_prefix: metadata_prefix)
end
- private
+ protected
+ def token_or_query_to_hash(token_or_query)
+ case token_or_query
+ when Hash
+ Query.new(token_or_query).to_hash
+ when Query
+ token_or_query.to_hash
+ when String
+ { resumption_token: token_or_query }
+ else
+ {}
+ end
+ end
+
+ private
+
def do_oai_request(method, options = {})
- response = @oai_client.send(method, options.cleanup)
+ response = options.cleanup.empty? ? @oai_client.send(method): @oai_client.send(method, options.cleanup)
object_to_hash(response)
rescue OAI::Exception => e
raise Libis::Services::ServiceError, "OAI Error: #{e.code} - #{e.message}"
end
@@ -69,10 +92,10 @@
when Hash
obj.each_with_object({}) do |k,v,h|
h[k] = object_to_hash(v)
end
when REXML::Element
- obj.to_s
+ Libis::Tools::XmlDocument.parse(obj.to_s).to_hash
when OAI::Response, OAI::Header, OAI::Record, OAI::MetadataFormat, OAI::Set
result = obj.instance_variables.map do |x|
x[1..-1].to_sym
end.select do |x|
![:_source, :doc, :resumption_block].include? x