Class: Crossref
Overview
FIXME This service is not working For starters it needs the method service_types_generated()
Constant Summary
Constant Summary
Constants inherited from Service
Service::LinkOutFilterTask, Service::StandardTask
Instance Attribute Summary (collapse)
-
- (Object) password
readonly
require 'open_url'.
-
- (Object) url
readonly
require 'open_url'.
-
- (Object) username
readonly
require 'open_url'.
Attributes inherited from Service
#name, #priority, #request, #service_id, #session_id, #status, #task
Instance Method Summary (collapse)
- - (Boolean) already_resolved?(id)
-
- (Boolean) can_resolve?(req)
Only request for things with DOIs.
- - (Object) handle(request)
-
- (Object) parse_record(body, request)
Enhance the referent with Crossref's metadata.
-
- (Object) resolve(id)
Grab response from Crossref's OpenURL resolver.
Methods inherited from Service
#display_name, #handle_wrapper, #initialize, #link_out_filter, #preempted_by, required_config_params, #response_to_view_data, #response_url, #service_types_generated, #session, #update_session, #view_data_from_service_type
Constructor Details
This class inherits a constructor from Service
Instance Attribute Details
- (Object) password (readonly)
require 'open_url'
6 7 8 |
# File 'lib/service_adaptors/crossref.rb', line 6 def password @password end |
- (Object) url (readonly)
require 'open_url'
6 7 8 |
# File 'lib/service_adaptors/crossref.rb', line 6 def url @url end |
- (Object) username (readonly)
require 'open_url'
6 7 8 |
# File 'lib/service_adaptors/crossref.rb', line 6 def username @username end |
Instance Method Details
- (Boolean) already_resolved?(id)
29 30 31 32 33 34 |
# File 'lib/service_adaptors/crossref.rb', line 29 def already_resolved?(id) if id.match(/^doi:/) id.sub!(/^doi:/, "info:doi/") end return CrossrefLookup.find_by_doi(id) end |
- (Boolean) can_resolve?(req)
Only request for things with DOIs
21 22 23 24 25 26 27 |
# File 'lib/service_adaptors/crossref.rb', line 21 def can_resolve?(req) req.referent.referent_values.find(:all, :conditions=>['key_name = ?', 'identifier']).each do | val | # DOIs can come in with either of these prefixes return val.value if val.value.match(/^(info:doi\/)|(doi:)10/) end return false end |
- (Object) handle(request)
7 8 9 10 11 12 13 14 15 16 17 |
# File 'lib/service_adaptors/crossref.rb', line 7 def handle(request) return request.dispatched(self, true) unless id = self.can_resolve?(request) return request.dispatched(self, true) if self.already_resolved?(id) unless request.dispatched?(self) return request.dispatched(self, false) unless response = self.resolve(id) self.parse_record(response, request) xref = CrossrefLookup.new(:doi=>id.sub(/^doi:/, "info:doi/")) xref.save return request.dispatched(self, true) end end |
- (Object) parse_record(body, request)
Enhance the referent with Crossref's metadata
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/service_adaptors/crossref.rb', line 59 def parse_record(body, request) require 'hpricot' doc = Hpricot(body) query = (doc/"/crossref_result/query_result/body/query").first if query && query.attributes['status'] == 'resolved' case (query/'/doi').first.attributes['type'] when "journal_article" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'article', true, false) when "journal_title" request.referent.enhance_referent('format', 'journal', false, false) request.referent.enhance_referent('genre', 'journal', true, false) when "journal_issue" request.referent.enhance_referent('format', 'journal', false, false) request.referent.enhance_referent('genre', 'issue', true, false) when "journal_volume" request.referent.enhance_referent('format', 'journal', false, false) when "conference_title" request.referent.enhance_referent('format', 'journal', false, false) request.referent.enhance_referent('genre', 'conference', true, false) when "conference_series" request.referent.enhance_referent('format', 'journal', false, false) request.referent.enhance_referent('genre', 'conference', true, false) when "conference_paper" request.referent.enhance_referent('format', 'journal', false, false) request.referent.enhance_referent('genre', 'proceeding', true, false) when "book_title" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'book', true, false) when "book_series" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'book', true, false) when "book_content" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'bookitem', true, false) when "report-paper_title" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'report', true, false) when "report-paper_title" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'report', true, false) when "report-paper_content" request.referent.enhance_referent('format', 'book', false, false) request.referent.enhance_referent('genre', 'report', true, false) end if (query/'/journal_title').first request.referent.enhance_referent('jtitle', (query/'/journal_title').first.inner_html, true, false) end if (query/'/article_title').first request.referent.enhance_referent('atitle', (query/'/article_title').first.inner_html, true, false) end if (query/'/volume').first request.referent.enhance_referent('volume', (query/'/volume').first.inner_html, true, false) end if (query/'/issue').first request.referent.enhance_referent('issue', (query/'/issue').first.inner_html, true, false) end if (query/'/first_page').first request.referent.enhance_referent('spage', (query/'/first_page').first.inner_html, true, false) end if (query/'/year').first request.referent.enhance_referent('date', (query/'/year').first.inner_html, true, false) end if (query/'/author').first request.referent.enhance_referent('au', (query/'/author').first.inner_html, true, false) end if (query/'/journal_abbreviation').first request.referent.enhance_referent('stitle', (query/'/journal_abbreviation').first.inner_html, true, false) end if (query/'/isbn').first request.referent.enhance_referent('isbn', (query/'/isbn').first.inner_html, true, false) end (query/'issn').each do | issn | field = case issn.attributes['type'] when 'print' then 'issn' when 'electronic' then 'eissn' end unless issn.inner_html == '00000000' request.referent.enhance_referent(field, (query/'/issn').first.inner_html, true, false) end end end end |
- (Object) resolve(id)
Grab response from Crossref's OpenURL resolver
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/service_adaptors/crossref.rb', line 37 def resolve(id) context_object = OpenURL::ContextObject.new if id.match(/^doi:/) id.sub!(/^doi:/, "info:doi/") end context_object.referent.set_identifier(id) transport = OpenURL::Transport.new(self.url, context_object) if self.username transport.extra_args['pid'] = self.username+":"+self.password end transport.extra_args['noredirect']='true' puts context_object.kev begin transport.transport_inline puts transport.response return transport.response rescue Timeout::Error return false end end |