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

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