Merge branch 'release/v3.2.0'
[model] / application.rb
1 require 'rubygems'
2 gem "opentox-ruby", "~> 4"
3 require 'opentox-ruby'
4
5 set :lock, true
6
7 @@datadir = "data"
8
9 class PredictionCache < Ohm::Model
10   attribute :compound_uri
11   attribute :model_uri
12   attribute :dataset_uri
13
14   index :compound_uri
15   index :model_uri
16 end
17
18 before do
19   @accept = request.env['HTTP_ACCEPT']
20   @accept = 'application/rdf+xml' if @accept == '*/*' or @accept == '' or @accept.nil?
21   response['Content-Type'] = @accept
22   @id = request.path_info.match(/^\/\d+/)
23   unless @id.nil?
24     @id = @id.to_s.sub(/\//,'').to_i
25
26     @uri = uri @id
27     @json_file = "#{@@datadir}/#{@id}.json"
28     raise OpenTox::NotFoundError.new "Model #{@id} not found." unless File.exists? @json_file
29
30     extension = File.extname(request.path_info)
31     unless extension.empty?
32       case extension
33       when ".html"
34         @accept = 'text/html'
35       when ".yaml"
36         @accept = 'application/x-yaml'
37       when ".json"
38         @accept = 'application/json'
39       when ".rdfxml"
40         @accept = 'application/rdf+xml'
41       else
42         raise OpenTox::NotFoundError.new "File format #{extension} not supported."
43       end
44     end
45   end
46
47   # make sure subjectid is not included in params, subjectid is set as member variable
48   params.delete(:subjectid) 
49 end
50
51 require 'lazar.rb'
52
53 helpers do
54
55   def next_id
56     id = Dir["./#{@@datadir}/*json"].collect{|f| File.basename(f.sub(/.json/,'')).to_i}.sort.last
57     id = 0 if id.nil?
58     id + 1
59   end
60
61   def uri(id)
62     url_for "/#{id}", :full
63   end
64
65   def activity(a)
66     case a.to_s
67     when "true"
68       act = "active"
69     when "false"
70       act = "inactive"
71     else
72       act = "not available"
73     end
74     act
75   end
76 end
77
78 get '/?' do # get index of models
79   uri_list = Dir["./#{@@datadir}/*json"].collect{|f| File.basename(f.sub(/.json/,'')).to_i}.sort.collect{|n| uri n}.join("\n") + "\n"
80   case @accept
81   when /html/
82     response['Content-Type'] = 'text/html'
83     OpenTox.text_to_html uri_list
84   else
85     response['Content-Type'] = 'text/uri-list'
86     uri_list
87   end
88 end
89
90 delete '/:id/?' do
91   LOGGER.debug "Deleting model with id "+@id.to_s
92   begin
93     FileUtils.rm @json_file
94     if @subjectid and !File.exists? @json_file and @uri
95       begin
96         res = OpenTox::Authorization.delete_policies_from_uri(@uri, @subjectid)
97         LOGGER.debug "Policy deleted for Model URI: #{@uri} with result: #{res}"
98       rescue
99         LOGGER.warn "Policy delete error for Model URI: #{@uri}"
100       end
101     end
102     response['Content-Type'] = 'text/plain'
103     "Model #{@id} deleted."
104   rescue
105     raise OpenTox::NotFoundError.new "Model #{@id} does not exist."
106   end
107 end
108
109
110 delete '/?' do
111   # TODO delete datasets
112   FileUtils.rm Dir["#{@@datadir}/*.json"]
113   PredictionCache.all.each {|cache| cache.delete }
114   response['Content-Type'] = 'text/plain'
115   "All models and cached predictions deleted."
116 end