summaryrefslogtreecommitdiff
path: root/lib/task.rb
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.ch>2013-03-26 10:56:04 +0100
committerChristoph Helma <helma@in-silico.ch>2013-03-26 10:56:04 +0100
commita54db46684680d98311631804eca367cc949a715 (patch)
tree283b8c5f256e8605131cbfeae2217a77d0288ca7 /lib/task.rb
parent4ba2cc9849473f97baf75195bb36c5057f1c58d4 (diff)
code cleanup and refactoring.
Diffstat (limited to 'lib/task.rb')
-rw-r--r--lib/task.rb90
1 files changed, 71 insertions, 19 deletions
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