From a54db46684680d98311631804eca367cc949a715 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 26 Mar 2013 10:56:04 +0100 Subject: code cleanup and refactoring. --- lib/task.rb | 90 ++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 19 deletions(-) (limited to 'lib/task.rb') diff --git a/lib/task.rb b/lib/task.rb index 82e1665..07c0b05 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -6,33 +6,55 @@ module OpenTox attr_accessor :pid, :observer_pid - def self.create service_uri, subjectid=nil, params={} + def metadata + super true # always update metadata + end + + def self.run(description, creator=nil, subjectid=nil) - uri = File.join(service_uri,SecureRandom.uuid) - task = Task.new uri, subjectid + task = Task.new nil, subjectid task[RDF::OT.created_at] = DateTime.now task[RDF::OT.hasStatus] = "Running" - params.each { |k,v| task[k] = v } - task.put false + task[RDF::DC.description] = description.to_s + task[RDF::DC.creator] = creator.to_s + task.put pid = fork do begin - result_uri = yield - task.completed result_uri + task.completed yield + #result_uri = yield + #task.completed result_uri rescue - unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised - cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} - cut_index = -1 unless cut_index +=begin + #unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised msg = "\nTask ERROR\n"+ - "task description: #{params[RDF::DC.description]}\n"+ + "task description: #{task[RDF::DC.description]}\n"+ "task uri: #{$!.class.to_s}\n"+ "error msg: #{$!.message}\n"+ "error backtrace:\n#{$!.backtrace[0..cut_index].join("\n")}\n" $logger.error msg - end + #end +=end if $!.respond_to? :to_ntriples + puts $!.to_turtle RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') else - RestClientWrapper.put(File.join(task.uri,'Error')) + cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} + cut_index = -1 unless cut_index + @rdf = RDF::Graph.new + subject = RDF::Node.new + @rdf << [subject, RDF.type, RDF::OT.ErrorReport] + @rdf << [subject, RDF::OT.message, $!.message] + @rdf << [subject, RDF::OT.errorCode, $!.class.to_s] + @rdf << [subject, RDF::OT.errorCause, $!.backtrace[0..cut_index].join("\n")] + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", :ot => RDF::OT.to_s} + turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + @rdf.each{|statement| writer << statement} + end + $logger.error turtle + nt = RDF::Writer.for(:ntriples).buffer do |writer| + @rdf.each{|statement| writer << statement} + end + RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => nt,:content_type => 'text/plain') end task.kill end @@ -73,23 +95,21 @@ module OpenTox kill self.[]=(RDF::OT.hasStatus, "Cancelled") self.[]=(RDF::OT.finished_at, DateTime.now) - put false + put end def completed(uri) self.[]=(RDF::OT.resultURI, uri) self.[]=(RDF::OT.hasStatus, "Completed") self.[]=(RDF::OT.finished_at, DateTime.now) - put false + put end # waits for a task, unless time exceeds or state is no longer running - # @param [optional,Numeric] dur seconds pausing before checking again for completion - # TODO: add waiting task def wait start_time = Time.new due_to_time = start_time + DEFAULT_TASK_MAX_DURATION - dur = 0.3 + dur = 0.2 while running? sleep dur dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min @@ -122,14 +142,20 @@ module OpenTox [:hasStatus, :resultURI, :created_at, :finished_at].each do |method| define_method method do - get response = self.[](RDF::OT[method]) response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility response end end + # Check status of a task + # @return [String] Status + def status + self[RDF::OT.hasStatus] + end + def error_report + get report = {} query = RDF::Query.new({ :report => { @@ -144,5 +170,31 @@ module OpenTox end #TODO: subtasks (only for progress) + class SubTask + + def initialize(task, min, max) + #TODO add subtask code + end + + def self.create(task, min, max) + if task + SubTask.new(task, min, max) + else + nil + end + end + + def waiting_for(task_uri) + #TODO add subtask code + end + + def progress(pct) + #TODO add subtask code + end + + def running?() + #TODO add subtask code + end + end end -- cgit v1.2.3