Class: Crossref

Inherits:
Service show all
Defined in:
lib/service_adaptors/crossref.rb

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)

Attributes inherited from Service

#name, #priority, #request, #service_id, #session_id, #status, #task

Instance Method Summary (collapse)

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)

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


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