class PubliSci::SADI_request
Public Class Methods
fetch_async(service,turtle)
click to toggle source
# File lib/publisci/post_processor.rb, line 9 def self.fetch_async(service,turtle) gr = send_request(service,turtle) rdfs = RDF::Vocabulary.new("http://www.w3.org/2000/01/rdf-schema#") polls = RDF::Query.execute(gr) do pattern [:obj, rdfs.isDefinedBy, :def] end poll_time = {} polls.map(&:def).select{|res| res.to_s["?poll="]}.each{|poll_url| poll_time[poll_url.to_s] = Time.now } results = [] until results.size == poll_time.keys.size poll_url = poll_time.sort_by{|k,v| v}.first.first t = Time.now if poll_time[poll_url] > t puts "no poll urls ready, sleeping #{poll_time[poll_url] - t}" sleep poll_time[poll_url] - t end result = poll(poll_url) if result.is_a? Fixnum puts "#{poll_url} Response not ready, waiting #{result}" poll_time[poll_url] = Time.now + result else results << result end end results end
poll(url)
click to toggle source
# File lib/publisci/post_processor.rb, line 44 def self.poll(url) resp = RestClient.get(url, accept: 'text/rdf+n3'){ |response, request, result, &block| if [301, 302, 307].include? response.code wait = response.headers[:retry_after] if wait return wait.to_i else response.follow_redirection(request, result, &block) end else response.return!(request, result, &block) end } resp.body end
send_request(service, turtle)
click to toggle source
# File lib/publisci/post_processor.rb, line 4 def self.send_request(service, turtle) response = RestClient.post(service, turtle, content_type: 'text/rdf+n3', accept: 'text/rdf+n3') RDF::Repository.new << RDF::Turtle::Reader.new(response) end
try_fetch(poll_url)
click to toggle source
# File lib/publisci/post_processor.rb, line 60 def self.try_fetch(poll_url) puts "polling #{poll_url}" loop do result = poll(poll_url) if result.is_a? Fixnum return result else return RDF::Repository.new << RDF::Turtle::Reader.new(result) end end end