Class: PubliSci::SADI_request

Inherits:
Object
  • Object
show all
Defined in:
lib/publisci/post_processor.rb

Class Method Summary collapse

Class Method Details

.fetch_async(service, turtle) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 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) ⇒ Object



4
5
6
7
# 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) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# 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