From 32ad3c8f6e1e16cfe9fd59a47df6b560ffb13ddd Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 1 Aug 2012 14:56:08 +0200 Subject: task error handling improved --- lib/compound.rb | 2 +- lib/error.rb | 56 +++++++++++++++++++++++++--------------------- lib/opentox.rb | 12 +++++----- lib/rest-client-wrapper.rb | 6 ++--- lib/task.rb | 17 ++++++++++++-- 5 files changed, 55 insertions(+), 38 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 5992ee3..7d84a3c 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -83,7 +83,7 @@ module OpenTox begin RestClientWrapper.get("#{CACTUS_URI}#{to_inchi}/names").split("\n") rescue - "not available" + "CACTVS service not responding." end end diff --git a/lib/error.rb b/lib/error.rb index d1abe52..84918b7 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -7,43 +7,49 @@ class RuntimeError super message @uri = uri @http_code ||= 500 - $logger.error "\n"+self.to_turtle + @rdf = RDF::Graph.new + subject = RDF::Node.new + @rdf << [subject, RDF.type, RDF::OT.ErrorReport] + @rdf << [subject, RDF::OT.actor, @uri.to_s] + @rdf << [subject, RDF::OT.message, message.to_s] + @rdf << [subject, RDF::OT.statusCode, @http_code] + @rdf << [subject, RDF::OT.errorCode, self.class.to_s] + @rdf << [subject, RDF::OT.errorCause, short_backtrace] + $logger.error("\n"+self.to_turtle) end - # define to_ methods for all RuntimeErrors and various rdf formats - RDF_FORMATS.each do |format| + def short_backtrace + backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact + cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} + cut_index ||= backtrace.size + cut_index -= 1 + cut_index = backtrace.size-1 if cut_index < 0 + backtrace[0..cut_index].join("\n") + end + RDF_FORMATS.each do |format| + # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do - rdf = RDF::Writer.for(format).buffer do |writer| - # TODO: not used for turtle - # http://rdf.rubyforge.org/RDF/Writer.html# - writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#') - writer.prefix :ot1_1, RDF::URI('http://www.opentox.org/api/1.1#') - subject = RDF::Node.new - writer << [subject, RDF.type, RDF::OT.ErrorReport] - writer << [subject, RDF::OT.actor, @uri.to_s] - writer << [subject, RDF::OT.message, message.to_s] - writer << [subject, RDF::OT.statusCode, @http_code] - writer << [subject, RDF::OT.errorCode, self.class.to_s] - - # cut backtrace - backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact - cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} - cut_index ||= backtrace.size - cut_index -= 1 - cut_index = backtrace.size-1 if cut_index < 0 - details = backtrace[0..cut_index].join("\n") - writer << [subject, RDF::OT.errorCause, details] + RDF::Writer.for(format).buffer do |writer| + @rdf.each{|statement| writer << statement} end - rdf end + end + def to_turtle # redefine to use prefixes (not supported by RDF::Writer) + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} + ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } + RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + @rdf.each{|statement| writer << statement} + end end + end module OpenTox class Error < RuntimeError + def initialize code, message, uri=nil @http_code = code super message, uri @@ -72,7 +78,7 @@ module OpenTox # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, klass.underscore.to_sym) do |message,uri=nil| - raise c, message, uri + raise c.new(message, uri) end end diff --git a/lib/opentox.rb b/lib/opentox.rb index 2c4578f..80644db 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -118,12 +118,11 @@ module OpenTox if URI.task?(uri) t = OpenTox::Task.new uri t.wait - if t.completed? - uri = t.resultURI - else + unless t.completed? #TODO raise correct error - internal_server_error "Task #{uri} failed with #{$!.inspect}" + #internal_server_error "Task #{uri} failed with #{$!.inspect}" end + uri = t.resultURI end uri end @@ -140,17 +139,16 @@ module OpenTox # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do - rdf = RDF::Writer.for(format).buffer do |writer| + RDF::Writer.for(format).buffer do |writer| @rdf.each{|statement| writer << statement} end - rdf end end def to_turtle # redefine to use prefixes (not supported by RDF::Writer) prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| @rdf.each{|statement| writer << statement} end end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index e89c90d..387a01b 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -17,9 +17,9 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil - bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - #not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) - bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri + #not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| if defined? $aa || URI(uri).host == URI($aa[:uri]).host diff --git a/lib/task.rb b/lib/task.rb index 0b0aea2..42bc84b 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -47,7 +47,7 @@ module OpenTox def kill Process.kill(9,@pid) Process.kill(9,@observer_pid) - rescue # no need to raise an exeption if processes are not running + rescue # no need to raise an exception if processes are not running end def description @@ -82,7 +82,6 @@ module OpenTox dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end - get end end @@ -114,6 +113,20 @@ module OpenTox end end + def error_report + report = {} + query = RDF::Query.new({ + :report => { + RDF.type => RDF::OT.ErrorReport, + :property => :value, + } + }) + query.execute(@rdf).each do |solution| + report[solution.property] = solution.value.to_s + end + report + end + #TODO: subtasks (only for progress) end -- cgit v1.2.3