summaryrefslogtreecommitdiff
path: root/application.rb
blob: e340b241dfe16150213d537f1f35b52702fdbb7d (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
require 'rubygems'
gem 'opentox-ruby-api-wrapper', '=1.2.6'
require 'opentox-ruby-api-wrapper'
require 'do_sqlite3'
require 'dm-core'
require 'dm-serializer'
require 'dm-timestamps'
require 'dm-types'

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/dataset.sqlite3")

class Dataset
	include DataMapper::Resource
	property :id, Serial
	property :uri, String, :length => 100
	property :file, String
	#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
	Dataset.all.collect{|d| d.uri}.join("\n")
end

get '/:id/?' do
	dataset = Dataset.get(params[:id])
	halt 404, "Dataset #{uri} not found." unless dataset
	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
		dataset.owl
	when /yaml/
		OpenTox::Dataset.find(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
	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
	dataset.owl = d.rdf
	dataset.uri = uri
	dataset.save
	print dataset.uri
	uri
end

delete '/:id/?' do
	begin
		dataset = Dataset.get(params[:id])
		File.delete dataset.file
		dataset.destroy!
		"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
	"All datasets deleted."
end