summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--application.rb41
-rw-r--r--data/.gitignore3
-rw-r--r--lazar.rb95
4 files changed, 95 insertions, 45 deletions
diff --git a/.gitignore b/.gitignore
index 4638e4f..45c8bd1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ tmp/*
log/*
db/*
public/*
+data/*
diff --git a/application.rb b/application.rb
index 7d3de38..0507ad8 100644
--- a/application.rb
+++ b/application.rb
@@ -4,6 +4,8 @@ require 'opentox-ruby'
set :lock, true
+@@datadir = "data"
+
class PredictionCache < Ohm::Model
attribute :compound_uri
attribute :model_uri
@@ -22,8 +24,24 @@ before do
@id = @id.to_s.sub(/\//,'').to_i
@uri = uri @id
- @yaml_file = "public/#{@id}.yaml"
- raise OpenTox::NotFoundError.new "Model #{@id} not found." unless File.exists? @yaml_file
+ @json_file = "#{@@datadir}/#{@id}.json"
+ raise OpenTox::NotFoundError.new "Model #{@id} not found." unless File.exists? @json_file
+
+ extension = File.extname(request.path_info)
+ unless extension.empty?
+ case extension
+ when ".html"
+ @accept = 'text/html'
+ when ".yaml"
+ @accept = 'application/x-yaml'
+ when ".json"
+ @accept = 'application/json'
+ when ".rdfxml"
+ @accept = 'application/rdf+xml'
+ else
+ raise OpenTox::NotFoundError.new "File format #{extension} not supported."
+ end
+ end
end
# make sure subjectid is not included in params, subjectid is set as member variable
@@ -35,7 +53,7 @@ require 'lazar.rb'
helpers do
def next_id
- id = Dir["./public/*yaml"].collect{|f| File.basename(f.sub(/.yaml/,'')).to_i}.sort.last
+ id = Dir["./#{@@datadir}/*json"].collect{|f| File.basename(f.sub(/.json/,'')).to_i}.sort.last
id = 0 if id.nil?
id + 1
end
@@ -58,15 +76,22 @@ helpers do
end
get '/?' do # get index of models
- response['Content-Type'] = 'text/uri-list'
- Dir["./public/*yaml"].collect{|f| File.basename(f.sub(/.yaml/,'')).to_i}.sort.collect{|n| uri n}.join("\n") + "\n"
+ uri_list = Dir["./#{@@datadir}/*json"].collect{|f| File.basename(f.sub(/.json/,'')).to_i}.sort.collect{|n| uri n}.join("\n") + "\n"
+ case @accept
+ when /html/
+ response['Content-Type'] = 'text/html'
+ OpenTox.text_to_html uri_list
+ else
+ response['Content-Type'] = 'text/uri-list'
+ uri_list
+ end
end
delete '/:id/?' do
LOGGER.debug "Deleting model with id "+@id.to_s
begin
- FileUtils.rm @yaml_file
- if @subjectid and !File.exists? @yaml_file and @uri
+ FileUtils.rm @json_file
+ if @subjectid and !File.exists? @json_file and @uri
begin
res = OpenTox::Authorization.delete_policies_from_uri(@uri, @subjectid)
LOGGER.debug "Policy deleted for Model URI: #{@uri} with result: #{res}"
@@ -84,7 +109,7 @@ end
delete '/?' do
# TODO delete datasets
- FileUtils.rm Dir["public/*.yaml"]
+ FileUtils.rm Dir["#{@@datadir}/*.json"]
PredictionCache.all.each {|cache| cache.delete }
response['Content-Type'] = 'text/plain'
"All models and cached predictions deleted."
diff --git a/data/.gitignore b/data/.gitignore
new file mode 100644
index 0000000..59e3edd
--- /dev/null
+++ b/data/.gitignore
@@ -0,0 +1,3 @@
+*.rdfxml
+*.xls
+*.yaml
diff --git a/lazar.rb b/lazar.rb
index fa54ed6..3af6c1c 100644
--- a/lazar.rb
+++ b/lazar.rb
@@ -1,63 +1,85 @@
require "haml"
+helpers do
+
+ def yaml_file(id)
+ file = "#{@@datadir}/#{id}.yaml"
+ unless File.exists? file # lazy yaml generation
+ lazar = OpenTox::Model::Lazar.from_json(File.read(@json_file))
+ File.open(file,"w+") { |f| f.puts lazar.to_yaml }
+ end
+ file
+ end
+
+ def lazar
+ OpenTox::Model::Lazar.from_json(File.read(@json_file))
+ end
+
+ #def metadata
+ #lazar.metadata
+ #end
+
+end
+
# Get model representation
-# @return [application/rdf+xml,application/x-yaml] Model representation
+# @return [application/rdf+xml,application/x-yaml,aapplication/json] Model representation
get '/:id/?' do
- raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @yaml_file
+ raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @json_file
case @accept
when /application\/rdf\+xml/
response['Content-Type'] = 'application/rdf+xml'
s = OpenTox::Serializer::Owl.new
- metadata = YAML.load_file(@yaml_file).metadata
- s.add_model(@uri,metadata)
+ s.add_model(@uri,lazar.metadata)
s.to_rdfxml
when /yaml/
- response['Content-Type'] = 'application/x-yaml'
- File.read @yaml_file
+ send_file yaml_file(params[:id]), :type => 'application/x-yaml'
+ when /json/
+ send_file @json_file, :type => 'application/json'
when /html/
response['Content-Type'] = 'text/html'
- OpenTox.text_to_html File.read(@yaml_file)
+ #OpenTox.text_to_html File.read(yaml_file(params[:id]))
+ OpenTox.text_to_html JSON.pretty_generate(JSON.parse(File.read(@json_file)))
else
raise OpenTox::BadRequestError.new "Unsupported MIME type '#{@accept}'"
end
end
get '/:id/metadata.?:ext?' do
- raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @yaml_file
+ raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @json_file
@accept = "application/x-yaml" if params[:ext] and params[:ext].match(/yaml/)
- metadata = YAML.load_file(@yaml_file).metadata
case @accept
when /yaml/
- metadata.to_yaml
+ lazar.metadata.to_yaml
else #when /rdf/ and anything else
serializer = OpenTox::Serializer::Owl.new
- serializer.add_metadata @uri, metadata
+ serializer.add_metadata @uri, lazar.metadata
serializer.to_rdfxml
end
end
get '/:id/dependent.?:ext?' do
- raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @yaml_file
+ raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @json_file
@accept = "application/x-yaml" if params[:ext] and params[:ext].match(/yaml/)
- feature_uri = YAML.load_file(@yaml_file).metadata[OT.dependentVariables]
+ feature_uri = lazar.metadata[OT.dependentVariables]
case @accept
when /yaml/
- OpenTox::Feature.find(feature_uri).to_yaml
+ OpenTox::Feature.find(feature_uri, @subjectid).to_yaml
when "text/uri-list"
feature_uri
when /rdf/
- OpenTox::Feature.find(feature_uri).to_rdfxml
+ OpenTox::Feature.find(feature_uri, @subjectid).to_rdfxml
when /html/
- OpenTox.text_to_html OpenTox::Feature.find(feature_uri).to_yaml
+ OpenTox.text_to_html OpenTox::Feature.find(feature_uri, @subjectid).to_yaml
else
raise OpenTox::BadRequestError.new "Unsupported MIME type '#{@accept}'"
end
end
get '/:id/predicted/:prop' do
- raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @yaml_file
+ raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @json_file
if params[:prop] == "value" or params[:prop] == "confidence"
- feature = eval "YAML.load_file(@yaml_file).prediction_#{params[:prop]}_feature"
+ #feature = eval "YAML.load_file(@json_file).prediction_#{params[:prop]}_feature"
+ feature = eval "lazar.prediction_#{params[:prop]}_feature"
case @accept
when /yaml/
content_type "application/x-yaml"
@@ -77,9 +99,9 @@ get '/:id/predicted/:prop' do
end
get '/:id/predicted.?:ext?' do
- raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @yaml_file
+ raise OpenTox::NotFoundError.new "Model #{params[:id]} not found." unless File.exists? @json_file
@accept = "application/x-yaml" if params[:ext] and params[:ext].match(/yaml/)
- features = YAML.load_file(@yaml_file).prediction_features
+ features = lazar.prediction_features
case @accept
when "text/uri-list"
"#{features.collect{|f| f.uri}.join("\n")}\n"
@@ -89,7 +111,6 @@ get '/:id/predicted.?:ext?' do
serializer = OpenTox::Serializer::Owl.new
features.each{|f| serializer.add_feature(f.uri,f.metadata)}
serializer.to_rdfxml
- #feature.to_rdfxml
when /html/
OpenTox.text_to_html features.to_yaml
else
@@ -97,21 +118,21 @@ get '/:id/predicted.?:ext?' do
end
end
-# Store a lazar model. This method should not be called directly, use OpenTox::Algorithm::Lazr to create a lazar model
+# Store a lazar model. This method should not be called directly, use OpenTox::Algorithm::Lazar to create a lazar model
# @param [Body] lazar Model representation in YAML format
# @return [String] Model URI
post '/?' do # create model
- raise OpenTox::BadRequestError.new "MIME type \"#{request.content_type}\" not supported." unless request.content_type.match(/yaml/)
+ raise OpenTox::BadRequestError.new "MIME type \"#{request.content_type}\" not supported." unless request.content_type.match(/json/)
@id = next_id
@uri = uri @id
- @yaml_file = "public/#{@id}.yaml"
- lazar = YAML.load request.env["rack.input"].read
- lazar.uri = @uri
+ @json_file = "#{@@datadir}/#{@id}.json"
+ hash = Yajl::Parser.parse request.env["rack.input"].read
+ hash["uri"] = @uri
value_feature_uri = File.join( @uri, "predicted", "value")
confidence_feature_uri = File.join( @uri, "predicted", "confidence")
- lazar.metadata[OT.predictedVariables] = [value_feature_uri, confidence_feature_uri]
- File.open(@yaml_file,"w+"){|f| f.puts lazar.to_yaml}
- OpenTox::Authorization.check_policy(@uri, @subjectid) if File.exists? @yaml_file
+ hash["metadata"][OT.predictedVariables] = [value_feature_uri, confidence_feature_uri]
+ File.open(@json_file,"w+"){|f| f.puts Yajl::Encoder.encode(hash)}
+ OpenTox::Authorization.check_policy(@uri, @subjectid) if File.exists? @json_file
response['Content-Type'] = 'text/uri-list'
@uri
end
@@ -123,30 +144,30 @@ end
# @return [text/uri-list] URI of prediction task (dataset prediction) or prediction dataset (compound prediction)
post '/:id/?' do
- raise OpenTox::NotFoundError.new "Model #{params[:id]} does not exist." unless File.exists? @yaml_file
+ raise OpenTox::NotFoundError.new "Model #{params[:id]} does not exist." unless File.exists? @json_file
raise OpenTox::NotFoundError.new "No compound_uri or dataset_uri parameter." unless compound_uri = params[:compound_uri] or dataset_uri = params[:dataset_uri]
- @lazar = YAML.load_file @yaml_file
+ #@lazar = YAML.load_file @json_file
response['Content-Type'] = 'text/uri-list'
if compound_uri
- cache = PredictionCache.find(:model_uri => @lazar.uri, :compound_uri => compound_uri).first
+ cache = PredictionCache.find(:model_uri => lazar.uri, :compound_uri => compound_uri).first
if cache and uri_available?(cache.dataset_uri)
return cache.dataset_uri
else
begin
- prediction_uri = @lazar.predict(compound_uri,true,@subjectid).uri
- PredictionCache.create(:model_uri => @lazar.uri, :compound_uri => compound_uri, :dataset_uri => prediction_uri)
+ prediction_uri = lazar.predict(compound_uri,true,@subjectid).uri
+ PredictionCache.create(:model_uri => lazar.uri, :compound_uri => compound_uri, :dataset_uri => prediction_uri)
prediction_uri
rescue
LOGGER.error "Lazar prediction failed for #{compound_uri} with #{$!} "
- raise "Prediction of #{compound_uri} with #{@lazar.uri} failed."
+ raise "Prediction of #{compound_uri} with #{lazar.uri} failed."
end
end
elsif dataset_uri
- task = OpenTox::Task.create("Predict dataset",url_for("/#{@lazar.id}", :full)) do |task|
- @lazar.predict_dataset(dataset_uri, @subjectid, task).uri
+ task = OpenTox::Task.create("Predict dataset",url_for("/#{lazar.id}", :full)) do |task|
+ lazar.predict_dataset(dataset_uri, @subjectid, task).uri
end
raise OpenTox::ServiceUnavailableError.newtask.uri+"\n" if task.status == "Cancelled"
halt 202,task.uri