summaryrefslogtreecommitdiff
path: root/application.rb
blob: 9de59159d5e6ab6b961a9e20f20a842c1caf3df8 (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
require 'rubygems'
gem 'opentox-ruby-api-wrapper', '= 1.2.7'
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 :owl, Text, :length => 1000000
	property :created_at, DateTime

	def owl
		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

DataMapper.auto_upgrade!

## REST API

get '/?' do
	response['Content-Type'] = 'text/uri-list'
	Dataset.all.collect{|d| d.uri}.join("\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'
		OpenTox::Dataset.find(dataset.uri).to_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
	OpenTox::Dataset.find(url_for("/#{params[:id]}", :full)).features
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
		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 "application/rdf+xml"
			rdf =	request.env["rack.input"].read
			d= OpenTox::Dataset.new
			d.rdf = rdf
			d.uri = uri
		else
			halt 404, "MIME type \"#{request.content_type}\" not supported."
		end
		LOGGER.debug "Saving dataset #{uri}."
		begin
			dataset.owl = d.rdf
			dataset.uri = uri 
			dataset.save
			task.completed(uri) 
		rescue => e
			LOGGER.error e.message
			LOGGER.info e.backtrace
			halt 500, "Could not save 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
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