summaryrefslogtreecommitdiff
path: root/lib/task.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/task.rb')
-rw-r--r--lib/task.rb68
1 files changed, 28 insertions, 40 deletions
diff --git a/lib/task.rb b/lib/task.rb
index 0adb7a0..aee6c62 100644
--- a/lib/task.rb
+++ b/lib/task.rb
@@ -1,62 +1,31 @@
+require File.join(File.dirname(__FILE__),'spork')
DEFAULT_TASK_MAX_DURATION = 36000
module OpenTox
# Class for handling asynchronous tasks
class Task
-
- def self.create service_uri
- Task.new RestClient.post(service_uri,{}).chomp
- #eval("#{self}.new(\"#{uri}\", #{subjectid})")
- end
-
- def http_code
- get(@uri).code
- end
-
- def status
- metadata[RDF::OT.hasStatus].to_s
- end
-
- def result_uri
- metadata[RDF::OT.resultURI]
+ def self.create service_uri, params={}
+ task = Task.new RestClient.post(service_uri,params).chomp
+ pid = Spork.spork { yield }
+ task.pid = pid
+ task
end
def description
metadata[RDF::DC.description]
end
- def errorReport
- metadata[RDF::OT.errorReport]
- end
-
def cancel
- RestClient.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"})
+ RestClient.put(File.join(@uri,'Cancelled'),{})
end
def completed(uri)
RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri})
end
- def error(error_report)
- raise "no error report" unless error_report.is_a?(OpenTox::ErrorReport)
- RestClient.put(File.join(@uri,'Error'),{:errorReport => error_report.to_yaml})
- end
-
- def pid=(pid)
- RestClient.put(File.join(@uri,'pid'), {:pid => pid})
- end
-
- def running?
- metadata[RDF::OT.hasStatus] == 'Running'
- end
-
- def completed?
- metadata[RDF::OT.hasStatus] == 'Completed'
- end
-
- def error?
- metadata[RDF::OT.hasStatus] == 'Error'
+ def error(error)
+ RestClient.put(File.join(@uri,'Error'),{:errorReport => OpenTox::Error.new(error)})
end
# waits for a task, unless time exceeds or state is no longer running
@@ -69,4 +38,23 @@ module OpenTox
end
end
+ def method_missing(method,*args)
+ method = method.to_s
+ begin
+ case method
+ when /=/
+ res = RestClient.put(File.join(@uri,method.sub(/=/,'')),{})
+ super unless res.code == 200
+ when /\?/
+ return metadata[RDF::OT.hasStatus] == method.sub(/\?/,'').capitalize
+ else
+ return metadata[RDF::OT[method]].to_s
+ end
+ rescue
+ super
+ end
+ end
+
+ #TODO: subtasks
+
end