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
128
129
130
131
|
require 'rubygems'
gem "opentox-ruby-api-wrapper", "= 1.6.6"
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, :hasStatus => task.hasStatus,
:resultURI => task.resultURI, :percentageCompleted => task.percentageCompleted, :description => task.description,
:due_to_time => task.due_to_time }
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
when /text\/uri\-list/
response['Content-Type'] = 'text/uri-list'
halt code, task.resultURI
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 with params "+params.inspect
max_duration = params.delete(:max_duration.to_s) if params.has_key?(:max_duration.to_s)
task = Task.new(params)
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) + max_duration.to_f).to_s) if 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
|