module BELParser::Resource

Constants

DEFAULT_SPARQL_ENDPOINT
READER_LOCK
RESOLVE_URI_LOCK
URISTRING_PATTERN

Public Class Methods

default_uri_reader() click to toggle source
# File lib/bel_parser/resource.rb, line 20
def self.default_uri_reader
  READER_LOCK.synchronize do
    @default_uri_reader
  end
end
default_uri_reader=(uri_reader) click to toggle source
# File lib/bel_parser/resource.rb, line 26
def self.default_uri_reader=(uri_reader)
  READER_LOCK.synchronize do
    @default_uri_reader = uri_reader
  end
end
default_url_reader() click to toggle source
# File lib/bel_parser/resource.rb, line 32
def self.default_url_reader
  READER_LOCK.synchronize do
    @default_url_reader
  end
end
default_url_reader=(url_reader) click to toggle source
# File lib/bel_parser/resource.rb, line 38
def self.default_url_reader=(url_reader)
  READER_LOCK.synchronize do
    @default_url_reader = url_reader
  end
end
resolve_uri(resource_url) click to toggle source

Resolves the URI String from the annotation or namespace resource.

The resource must contain a _URIString=…_ property.

@param [#to_s] resource_url the resource URL to resolve the URI from @return [String] the resource URI specified in the resource

# File lib/bel_parser/resource.rb, line 50
def self.resolve_uri(resource_url)
  resource_url = resource_url.to_s

  RESOLVE_URI_LOCK.synchronize do
    @uri_hash ||= {}
    return @uri_hash[resource_url] if @uri_hash.key?(resource_url)
  end

  uri              = URI(resource_url)
  request          = Net::HTTP::Get.new(uri)
  request['Range'] = 'bytes=0-5000'
  resource_uri     = nil

  http = Net::HTTP.new(uri.hostname, uri.port)
  http.request(request) do |response|
    response.read_body do |chunk|
      uristring    = chunk.lines.detect { |l| l =~ URISTRING_PATTERN }
      if uristring
        resource_uri = uristring.match(URISTRING_PATTERN)[1]
        break
      end
    end
  end

  RESOLVE_URI_LOCK.synchronize do
    @uri_hash ||= {}
    @uri_hash[resource_url] = resource_uri
  end

  resource_uri
end