module Calais class Client attr_accessor :license_id attr_accessor :content attr_accessor :content_type, :output_format attr_accessor :allow_distribution, :allow_search, :submitter, :external_id attr_accessor :external_metadata def initialize(options={}, &block) options.each {|k,v| send("#{k}=", v)} yield(self) if block_given? end def call(method, times=1) method = method.intern unless method.is_a?(Symbol) raise ArgumentError.new("Unknown method: #{method}") unless AVAILABLE_METHODS.keys.include? method post_args = { "licenseID" => @license_id, "content" => @content, "paramsXML" => params_xml } url = URI.parse(POST_URL + AVAILABLE_METHODS[method]) resp, data = Net::HTTP.post_form(url, post_args) handle_response(resp, data, method, times) end def self.process_data(data, error=nil) Calais::Response.new(data, error) end private def handle_response(resp, data, method, times) if resp.is_a? Net::HTTPOK [data, nil] elsif times >= MAX_RETRIES [data, "Too many retries: #{times}"] else call(method, times+1) end end def params_xml content_type = @content_type && AVAILABLE_CONTENT_TYPES.keys.include?(@content_type) ? AVAILABLE_CONTENT_TYPES[@content_type] : AVAILABLE_CONTENT_TYPES[DEFAULT_CONTENT_TYPE] output_format = @output_format && AVAILABLE_OUTPUT_FORMATS.keys.include?(@output_format) ? AVAILABLE_OUTPUT_FORMATS[@output_format] : AVAILABLE_OUTPUT_FORMATS[DEFAULT_OUTPUT_FORMAT] allow_distribution = @allow_distribution ? "true" : "false" allow_search = @allow_search ? "true" : "false" submitter = @submitter || DEFAULT_SUBMITTER external_id = @external_id || Digest::SHA1.hexdigest(@content.inspect) external_metadata = @external_metadata || "" xml = %[] xml += %[] xml += %[] xml += %[#{external_metadata}] xml += %[] end end end