lib/exlibris/primo/record.rb in exlibris-primo-0.1.5 vs lib/exlibris/primo/record.rb in exlibris-primo-1.0.0
- old
+ new
@@ -1,117 +1,31 @@
module Exlibris
module Primo
- # == Overview
- # Exlibris::Primo::Record is an abstract representation of a Primo record.
- # An instance of Exlibris::Primo::Record can be created by passing
- # in a hash with setup parameters.
- # Valid parameters include:
- # :base_url, :resolver_base_url, :vid, :institution, :record_id, :record
- # A URL to the native record (dlDisplay.do) and an OpenUrl are generated by default.
- # If no resolver_base_url is provided, an OpenUrl querystring will be returned.
- # A raw_xml attribute is generated either by the record XML passed in or by fetching it from the record_id.
- # By default the raw_xml is not included in the hash representation, but can be overridden to.
#
- # == Tips on Extending
- # When extending the class, a few basics guidelines should be observed.
- # 1. A Exlibris::Primo::Record is initialized from a Hash of parameters.
- # These params are used to create instance variables of the record attributes.
+ # Primo record
+ # Includes PNX elements such as
+ # holdings, links, openurl, frbr status
+ # dedupmgr status.
#
- # 2. The following methods are available for overriding:
- # to_h - if a sub class creates more instance variables, these should be added to the hash
- # raw - cleans up characters and spaces in raw record and wraps in <record /> tag, implementations may differ
- #
- # == Examples of usage
- # Record.new({ :base_url => @base_url, :vid => @vid, :record => doc.at("//record") })
class Record
- # Leverage ActiveSupport's Hash#from_xml method to transform PNX to JSON.
- require 'active_support/core_ext'
- require 'json'
+ include Config::Attributes
+ include Namespaces
+ include WriteAttributes
+ include XmlUtil
+ include Exlibris::Primo::Pnx::DedupMgr
+ include Exlibris::Primo::Pnx::Elements
+ include Exlibris::Primo::Pnx::Frbr
+ include Exlibris::Primo::Pnx::Holdings
+ include Exlibris::Primo::Pnx::Links
+ include Exlibris::Primo::Pnx::Openurl
+ include Exlibris::Primo::Pnx::Subfields
- SEAR_NS = {'sear' => 'http://www.exlibrisgroup.com/xsd/jaguar/search'}
- attr_reader :record_id, :type, :title, :url, :openurl, :creator, :raw_xml
-
- def initialize(parameters={})
- # Get base url of Primo application, required
- base_url = parameters[:base_url]
- raise_required_setup_parameter_error :base_url if base_url.nil?
- # Get base url of link resolver, if blank openurl generates just querystring
- resolver_base_url = parameters[:resolver_base_url]
- # Get vid from parameters, required
- vid = parameters.fetch(:vid, "DEFAULT")
- raise_required_setup_parameter_error :vid if vid.nil?
- # Get institution from parameters, required
- institution = parameters.fetch(:institution, "PRIMO")
- raise_required_setup_parameter_error :institution if institution.nil?
- # Get record: either fetch record from Web Service based on DocId or use passed in record xml, required
- record = (parameters[:record].nil?) ?
- (parameters[:record_id].nil?) ?
- nil : record_from_id(parameters.delete(:record_id), base_url, {:institution => institution, :vid => vid}) : parameters.delete(:record)
- raise_required_setup_parameter_error "record or record_id" if record.nil?
- # Set instance variables for record
- @record_id = record.at("control/recordid",record.namespaces).inner_text unless record.at("control/recordid",record.namespaces).nil?
- @type = record.at("display/type",record.namespaces).inner_text unless record.at("display/type",record.namespaces).nil?
- @title = record.at("display/title",record.namespaces).inner_text unless record.at("display/title",record.namespaces).nil?
- @url = construct_url(base_url, @record_id, institution, vid)
- @openurl = construct_openurl(resolver_base_url, record, @record_id)
- @creator = record.at("display/creator",record.namespaces).inner_text unless record.at("display/creator",record.namespaces).nil?
- @raw_xml = raw(record)
- end
+ add_duplicated_control_attributes :sourcerecordids, :sourceids,
+ :originalsourceids, :sourceformats, :sourcesystems, :ilsapiids
- # Return a hash representation of the primary record attributes
- def to_h
- return {
- "format" => @type.capitalize,
- "title" => @title,
- "author" => @creator,
- "url" => @url,
- "openurl" => @openurl
- }
- end
-
- # Return a JSON representation of the PNX record
- def to_json
- # Leverage ActiveSupport's Hash#from_xml method to transform PNX to JSON.
- Hash.from_xml(raw_xml).to_json
- end
-
- # Method for cleaning up raw xml from record
- def raw(record)
- record.to_xml(:indent => 0, :encoding => 'UTF-8')
- end
-
- private
- # Method for consturcting openurl from record
- def construct_openurl(resolver_base_url, record, record_id)
- raise_required_setup_parameter_error :record if record.nil?
- raise_required_setup_parameter_error :record_id if record_id.nil?
- openurl = (resolver_base_url.nil?) ? "?" : "#{resolver_base_url}?"
- record.search("addata/*",record.namespaces).each do |addata|
- openurl << "rft.#{addata.name}=#{addata.inner_text}&" unless (addata.inner_text.nil? or addata.inner_text.strip.empty?)
- end
- openurl << "rft.primo=#{record_id}"
- return openurl
- end
-
- # Method for constructing deep link url from record
- def construct_url(base_url, record_id, institution, vid)
- raise_required_setup_parameter_error :base_url if base_url.nil?
- raise_required_setup_parameter_error :record_id if record_id.nil?
- raise_required_setup_parameter_error :institution if institution.nil?
- raise_required_setup_parameter_error :vid if vid.nil?
- url = "#{base_url}/primo_library/libweb/action/dlDisplay.do?dym=false&onCampus=false&docId=#{record_id}&institution=#{institution}&vid=#{vid}"
- return url
- end
-
- # Fetch record from Primo Web Service
- def record_from_id(record_id, base_url, options={})
- doc = Exlibris::Primo::WebService::GetRecord.new(record_id, base_url, options).response.at("//sear:DOC", SEAR_NS)
- return doc.at("//xmlns:record",doc.namespaces)
- end
-
- # Raise error wrapper
- def raise_required_setup_parameter_error(parameter)
- raise ArgumentError.new("Error in #{self.class}. Missing required setup parameter: #{parameter}.")
+ def initialize *args
+ @raw_xml = args.last.delete(:raw_xml)
+ super
end
end
end
end
\ No newline at end of file