root/Explorator/trunk/vendor/plugins/activerdf_sparql-1.3.6/lib/activerdf_sparql/sparql_sesame_api.rb @ 487

Revision 487, 5.4 KB (checked in by mauriciobomfim, 7 years ago)

Added jruby support

Line 
1require 'rjb' unless RUBY_PLATFORM =~ /java/
2
3# SPARQL adapter
4class SparqlSesameApiAdapter < ActiveRdfAdapter
5 
6  $activerdflog.info "loading SPARQL SESAME API adapter"
7 
8  ConnectionPool.register_adapter(:sparql_sesame_api, self) 
9  attr_reader :caching  , :bridge
10  def reset_cache()     
11    @sparql_cache = {}
12  end
13  #  def SparqlAdapter.get_cache
14  #    return @sparql_cache
15  #  end
16 
17  # Instantiate the connection with the SPARQL Endpoint.
18  # available parameters:
19  # * :results => :sparql_xml
20  def initialize(params = {})   
21    super() 
22    @sparql_cache = {}
23    @reads = true
24    @writes = true
25    @caching = params[:caching] || false
26    @result_format = :sparql_xml       
27    @repository = params[:repository] 
28    @sesamedir =params[:dir] 
29    @title =params[:title] 
30   
31    sesame_jars=''
32    dir ="#{File.dirname(__FILE__)}/java/"
33    Dir.foreach(dir) {|x|       
34      sesame_jars += dir  + x +  File::PATH_SEPARATOR unless x.index('jar') == nil
35    }   
36    begin
37      vmargs = [ '-Xms256m', '-Xmx1024m' ]
38      vmargs << ('-Dinfo.aduna.platform.appdata.basedir=' + @sesamedir)
39
40      if RUBY_PLATFORM =~ /java/
41        sesame_jars = sesame_jars.split(File::PATH_SEPARATOR)
42        sesame_jars.each{ |v| require v }
43      else     
44        Rjb::load sesame_jars , vmargs
45      end
46     
47    rescue => ex
48      raise ex, "Could not load Java Virtual Machine. Please, check if your JAVA_HOME environment variable is pointing to a valid JDK (1.4+). #{ex}"
49     
50    rescue LoadError => ex
51      raise ex, "Could not load RJB. Please, install it properly with the command 'gem install rjb'"
52    end       
53    unless RUBY_PLATFORM =~ /java/
54      @bridge = Rjb::import('br.tecweb.explorator.SesameApiRubyAdapter').new(@repository)
55    else
56      @bridge = Java::BrTecwebExplorator::SesameApiRubyAdapter.new(@repository)
57    end
58  end 
59  def size
60    query(Query.new.select(:s,:p,:o).where(:s,:p,:o)).size
61  end
62 
63  # query datastore with query string (SPARQL), returns array with query results
64  # may be called with a block
65  def query(query, &block)   
66    qs = Query2SPARQL.translate(query)
67    if !(@title.include?'INTERNAL' and qs.to_s.include? "http://www.tecweb.inf.puc-rio.br")     
68      if @caching 
69        if is_into_cache(qs) 
70          $activerdflog.debug "cache hit for query #{qs}"
71          return  query_cache(qs)
72        end
73      end 
74    end
75    result = execute_sparql_query(qs, &block)
76    add_to_cache(qs, result) if @caching
77    result = [] if result == "timeout"
78    puts @title
79    puts qs.to_s 
80    return result
81  end
82 
83  # do the real work of executing the sparql query
84  def execute_sparql_query(qs, header=nil, &block)   
85    response = ''
86    begin 
87     
88      response = @bridge.query(qs.to_s)
89     
90      #  puts response
91    rescue 
92      raise ActiveRdfError, "JAVA BRIDGE ERRO ON SPARQL ADAPTER"
93      return "timeout"     
94    end   
95    # we parse content depending on the result format   
96    results =  parse_xml(response)   
97   
98    if block_given?
99      results.each do |*clauses|
100        yield(*clauses)
101      end
102    else     
103      results
104    end
105  end   
106  def close
107    ConnectionPool.remove_data_source(self)
108  end   
109 
110 
111  # adds triple(s,p,o) to datastore
112  # s,p must be resources, o can be primitive data or resource
113  def add(s,p,o,c=nil)
114   
115    # check illegal input
116    raise(ActiveRdfError, "adding non-resource #{s} while adding (#{s},#{p},#{o},#{c})") unless s.respond_to?(:uri)
117    raise(ActiveRdfError, "adding non-resource #{p} while adding (#{s},#{p},#{o},#{c})") unless p.respond_to?(:uri)
118    s = s.to_s if s != nil
119    p = p.to_s if p != nil
120    o = o.to_s if o != nil
121    c = c.to_s if c != nil
122    response = @bridge.insert(s,p,o,c)
123  end 
124 
125  def delete(s,p,o,c=nil)
126   
127    #    # check illegal input
128    #    raise(ActiveRdfError, "deleting non-resource #{s} while adding (#{s},#{p},#{o},#{c})") unless s.respond_to?(:uri)
129    #    raise(ActiveRdfError, "deleting non-resource #{p} while adding (#{s},#{p},#{o},#{c})") unless p.respond_to?(:uri)
130    #   
131    quad = [s,p,o,c].collect {|r| r.nil? ? nil : internalise(r) }
132    puts quad[0]
133    puts quad[1]
134    puts quad[2]
135    puts quad[3]
136    response = @bridge.delete(quad[0],quad[1],quad[2],quad[3])
137   
138  end 
139  # transform triple into internal format <uri> and "literal"
140  def internalise(r)
141    if r.respond_to?(:uri)
142      r.uri
143    elsif r.is_a?(Symbol)
144      nil
145    else
146      r.to_s
147    end
148  end
149  private
150  def add_to_cache(query_string, result)
151    if result.nil? or result.empty?
152      @sparql_cache.store(query_string, [])
153    else
154      if result == "timeout"
155        @sparql_cache.store(query_string, [])
156      else 
157        $activerdflog.debug "adding to sparql cache - query: #{query_string}"
158        @sparql_cache.store(query_string, result) 
159      end
160    end
161  end 
162  def is_into_cache(query_string)
163    @sparql_cache.include?(query_string)     
164  end
165  def query_cache(query_string)   
166    if @sparql_cache.include?(query_string)     
167      return @sparql_cache.fetch(query_string)
168    else
169      return nil
170    end
171  end 
172  # parse xml stream result into array
173  def parse_xml(s)   
174    parser = SparqlResultParser.new
175    REXML::Document.parse_stream(s, parser) 
176    parser.result
177  end 
178  # create ruby objects for each RDF node
179  def create_node(type, value)
180    case type
181      when 'uri'
182      RDFS::Resource.new(value)
183      when 'bnode'
184      BNode.new(value)
185      when 'literal','typed-literal'
186      value.to_s
187    end
188  end
189 
190end
Note: See TracBrowser for help on using the browser.