1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
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, 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 cancel
RestClient.put(File.join(@uri,'Cancelled'),{})
end
def completed(uri)
RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri})
end
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
# @param [optional,Numeric] dur seconds pausing before cheking again for completion
def wait_for_completion(dur=0.3)
due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION
while self.running?
raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time)
end
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
|