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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
require 'rubygems'
gem "opentox-ruby-api-wrapper", "= 1.6.1"
require 'opentox-ruby-api-wrapper'
#require "dm-is-tree"
class Task
include DataMapper::Resource
property :id, Serial
property :uri, String, :length => 255
property :created_at, DateTime
property :finished_at, DateTime
property :due_to_time, DateTime
property :pid, Integer
property :resultURI, String, :length => 255
property :percentageCompleted, Float, :default => 0
property :hasStatus, String, :default => "Running" #possible states are: "Cancelled", "Completed", "Running", "Error"
property :title, String, :length => 255
property :creator, String, :length => 255
property :description, Text
end
DataMapper.auto_upgrade!
get '/?' do
response['Content-Type'] = 'text/uri-list'
Task.all(params).collect{|t| t.uri}.join("\n") + "\n"
end
get '/:id/?' do
task = Task.get(params[:id])
halt 404, "Task '#{params[:id]}' not found." unless task
task_content = {:creator => task.creator, :title => task.title, :date => task.created_at.to_s, :hasStatus => task.hasStatus,
:resultURI => task.resultURI, :percentageCompleted => task.percentageCompleted, :description => task.description,
:due_to_time => task.due_to_time.to_s}
code = task.hasStatus == "Running" ? 202 : 200
case request.env['HTTP_ACCEPT']
when /application\/x-yaml|\*\/\*/ # matches 'application/x-yaml', '*/*'
response['Content-Type'] = 'application/x-yaml'
task_content[:uri] = task.uri
halt code, task_content.to_yaml
when /application\/rdf\+xml|\*\/\*/
response['Content-Type'] = 'application/rdf+xml'
owl = OpenTox::Owl.create 'Task', task.uri
task_content.each{ |k,v| owl.set(k.to_s,v)}
halt code, owl.rdf
else
halt 400, "MIME type '"+request.env['HTTP_ACCEPT'].to_s+"' not supported, valid Accept-Headers are \"application/rdf+xml\" and \"application/x-yaml\"."
end
end
# dynamic access to Task properties
get '/:id/:property/?' do
response['Content-Type'] = 'text/plain'
task = Task.get(params[:id])
halt 404,"Task #{params[:id]} not found." unless task
eval("task.#{params[:property]}").to_s
end
post '/?' do
LOGGER.debug "Creating new task ..."
task = Task.new
task.save # needed to create id
task.uri = url_for("/#{task.id}", :full)
task.due_to_time = DateTime.parse((Time.parse(task.created_at.to_s) + params[:max_duration].to_f).to_s) if params[:max_duration]
raise "could not save" unless task.save
response['Content-Type'] = 'text/uri-list'
task.uri + "\n"
end
put '/:id/:hasStatus/?' do
task = Task.get(params[:id])
halt 404,"Task #{params[:id]} not found." unless task
task.hasStatus = params[:hasStatus] unless /pid/ =~ params[:hasStatus]
task.description = params[:description] if params[:description]
case params[:hasStatus]
when "Completed"
LOGGER.debug "Task " + params[:id].to_s + " completed"
halt 402,"no param resultURI when completing task" unless params[:resultURI]
task.resultURI = params[:resultURI]
task.finished_at = DateTime.now
task.pid = nil
when "pid"
task.pid = params[:pid]
when /Cancelled|Error/
Process.kill(9,task.pid) unless task.pid.nil?
task.pid = nil
else
halt 402,"Invalid value for hasStatus: '"+params[:hasStatus].to_s+"'"
end
halt 500,"could not save task" unless task.save
end
delete '/:id/?' do
task = Task.get(params[:id])
halt 404, "Task #{params[:id]} not found." unless task
begin
Process.kill(9,task.pid) unless task.pid.nil?
rescue
halt 500,"Cannot kill task with pid #{task.pid}"
end
task.destroy!
response['Content-Type'] = 'text/plain'
"Task #{params[:id]} deleted."
end
delete '/?' do
Task.all.each do |task|
begin
Process.kill(9,task.pid) unless task.pid.nil?
rescue
"Cannot kill task with pid #{task.pid}"
end
#task.destroy!
end
Task.auto_migrate!
response['Content-Type'] = 'text/plain'
"All tasks deleted."
end
|