app/service_adaptors/hip3_service.rb
# Needs to be called Hip3Service to avoid conflicting with Hip3 module
# Params include:
# map_856_to_service : Umlaut ServiceTypeValue to map 856 links to. Defaults
# to fulltext_title_level
class Hip3Service < Service
required_config_params :base_path, :display_name
attr_reader :base_path
include MetadataHelper
include MarcHelper
def initialize(config)
# defaults
@map_856_to_service = 'fulltext'
# If you are sending an OpenURL from a library service, you may
# have the HIP bibnum, and include it in the OpenURL as, eg.
# rft_id=http://catalog.library.jhu.edu/bib/343434 (except URL-encoded)
# Then you'd set rft_id_bibnum_prefix to http://catalog.library.jhu.edu/bib/
@rft_id_bibnum_prefix = nil
@profile = "general"
super(config)
# Trim question-mark from base_url, if given
@base_path.chop! if (@base_path.rindex('?') == @base_path.length)
end
# Standard method, used by background service updater. See Service docs.
def service_types_generated
# We generate full text and holdings types, right now.
types = [ ServiceTypeValue[:fulltext], ServiceTypeValue[:holding], ServiceTypeValue[:table_of_contents] ]
return types
end
def handle(request)
bib_searcher = Hip3::BibSearcher.new(@base_path)
bib_searcher.issn = request.referent.issn
bib_searcher.isbn = request.referent.isbn
bib_searcher.sudoc = get_sudoc(request.referent)
results = bib_searcher.search
add_856_links(request, results.collect {|b| b.marc_xml})
add_copies(request, results)
return request.dispatched(self, true)
end
# Takes an array of Hip3::Bib objects believed to be exact matches
# for the citation querried, and adds response objects for them
# Returns a hash of arrays of ServiceResponses added.
def add_copies(request, bib_array, options = {})
#debugger
# default
options[:match_reliability] ||= ServiceResponse::MatchExact
responses_added = Hash.new
#Okay, we actually want to make each _copy_ into a service response.
#A bib may have multiple copies. We are merging bibs, and just worrying
#about the aggregated list of copies.
holdings = bib_array.collect { |bib| bib.holdings }.flatten
bib_array.each do |bib|
bib.holdings.each do |holding|
next if holding.dummy?
service_data = {}
service_data[:url] = holding.bib.http_url
service_data[:source_name] = holding.collection_str unless holding.collection_str.nil?
service_data[:call_number] = holding.call_no
service_data[:status] = holding.status_str
service_data[:location] = holding.location_str
service_data[:collection_str] = holding.collection_str
service_data[:copy_str] = holding.copy_str
service_data[:coverage_str] = holding.coverage_str
service_data[:coverage_str_array] = holding.coverage_str_to_a
service_data[:notes] = holding.notes
# If it's not a serial copy, we can add a direct request url.
unless ( holding.kind_of?(Hip3::SerialCopy) )
service_data[:request_url] = self.base_path + "?profile=#{@profile}&menu=request&aspect=none&bibkey=#{holding.bib.bibNum}&itemkey=#{holding.id}"
end
# Need to say it's not an exact match neccesarily?
unless ( options[:match_reliability] == ServiceResponse::MatchExact )
service_data[:match_reliability] = options[:match_reliability]
service_data[:edition_str] = edition_statement(bib.marc_xml)
end
display_text = ""
#display_text << (holding.location_str + ' ')unless holding.location_str.nil?
display_text << (holding.copy_str + ' ') unless holding.copy_str.nil?
# coverage strings, may be multiple
holding.coverage_str_to_a.each {|s| display_text << (s + ' ')}
display_text << holding.notes unless holding.notes.nil?
service_data[:display_text] = display_text
response = request.add_service_response(
service_data.merge(
:service=>self,
:service_type_value => 'holding' )
)
responses_added['holding'] ||= Array.new
responses_added['holding'].push( response )
end
end
return responses_added
end
def url_service_type( field )
return service_type_for_856(field, :default_service_type => @map_856_to_service)
end
def get_bibnum(rft)
return nil unless @rft_id_bibnum_prefix
identifier = rft.identifiers.find do |id|
id[0, @rft_id_bibnum_prefix.length] == @rft_id_bibnum_prefix
end
if ( identifier )
return identifier[@rft_id_bibnum_prefix.length, identifier.length]
else
return nil
end
end
end