summaryrefslogtreecommitdiff
path: root/application.rb
blob: 0a1b582c24adbc76f3ee13829cd6b361060a50af (plain)
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
132
133
134
135
136
137
138
139
140
require 'rubygems'
gem 'opentox-ruby-api-wrapper', '= 1.3.1'
require 'opentox-ruby-api-wrapper'

LOGGER.progname = File.expand_path(__FILE__)

class Dataset
	include DataMapper::Resource
	property :id, Serial
	property :uri, String, :length => 255
	property :file, String, :length => 255
	property :yaml, Text, :length => 2**32-1 
	property :created_at, DateTime

=begin
	def to_owl
		data = YAML.load(@yaml)
		owl = OpenTox::Owl.new
		owl.class = 'Dataset'
		owl.title = data.title
		owl.source = data.source
		data.data.each do |compound,features|
			feature 
		File.read self.file
	end

	def owl=(owl)
		self.file = File.join(File.dirname(File.expand_path(__FILE__)),'public',"#{id}.owl")
		File.open(self.file,"w+") { |f| f.write owl }
	end
=end
end

DataMapper.auto_upgrade!

## REST API

get '/?' do
	response['Content-Type'] = 'text/uri-list'
	Dataset.all.collect{|d| d.uri}.join("\n") + "\n"
end

get '/:id/?' do
	begin
		dataset = Dataset.get(params[:id])
	rescue => e
		LOGGER.error e.message
		LOGGER.warn e.backtrace
		halt 404, "Dataset #{params[:id]} not found."
	end
	accept = request.env['HTTP_ACCEPT']
	accept = 'application/rdf+xml' if accept == '*/*' or accept == '' or accept.nil?
	case accept
#	when /rdf/ # redland sends text/rdf instead of application/rdf+xml
#		response['Content-Type'] = 'application/rdf+xml'
#		dataset.owl
	when /yaml/
		response['Content-Type'] = 'application/x-yaml'
		dataset.yaml
	else
		halt 400, "Unsupported MIME type '#{accept}'"
	end
end

get '/:id/features/:feature_id/?' do
	OpenTox::Dataset.find(url_for("/#{params[:id]}", :full)).feature(params[:feature_id])
end

get '/:id/features/?' do
	YAML.load(Dataset.get(params[:id]).yaml).features.join("\n") + "\n"
end

get '/:id/compounds/?' do
	YAML.load(Dataset.get(params[:id]).yaml).compounds.join("\n") + "\n"
end

post '/?' do
#	task = OpenTox::Task.create
#	pid = Spork.spork(:logger => LOGGER) do

#		task.started
#		LOGGER.debug "Dataset task #{task.uri} started"

		dataset = Dataset.new
		dataset.save
		dataset.uri = url_for("/#{dataset.id}", :full)
		content_type = request.content_type
		content_type = "application/rdf+xml" if content_type.nil?
		case request.content_type
		when /yaml/
			dataset.yaml =	request.env["rack.input"].read
		when /csv/
			dataset.yaml =	csv2yaml request.env["rack.input"].read
		when "application/rdf+xml"
			dataset.yaml =	owl2yaml request.env["rack.input"].read
		else
			halt 404, "MIME type \"#{request.content_type}\" not supported."
		end
		LOGGER.debug "Saving dataset #{dataset.uri}."
		begin
			dataset.save
		rescue => e
			LOGGER.error e.message
			LOGGER.info e.backtrace
			halt 500, "Could not save dataset #{dataset.uri}."
		end
		LOGGER.debug "#{dataset.uri} saved."
#	end
#	task.pid = pid
	#status 303 # rest client tries to redirect
	response['Content-Type'] = 'text/uri-list'
# 	task.uri + "\n"
	dataset.uri + "\n"
end

delete '/:id/?' do
	begin
		dataset = Dataset.get(params[:id])
		#File.delete dataset.file
		dataset.destroy!
		response['Content-Type'] = 'text/plain'
		"Dataset #{params[:id]} deleted."
	rescue
		halt 404, "Dataset #{params[:id]} does not exist."
	end
end

delete '/?' do
	Dataset.all.each do |d|
		begin
			File.delete d.file 
		rescue
			LOGGER.error "Cannot delete dataset file '#{d.file}'"
		end
	 	#d.destroy!
	end
  Dataset.auto_migrate!
	response['Content-Type'] = 'text/plain'
	"All datasets deleted."
end