1 class CollectionsController < ApplicationController
2 skip_before_filter :find_object_by_uuid, :only => [:provenance]
3 skip_before_filter :check_user_agreements, :only => [:show_file]
6 %w(Files Attributes Metadata Provenance_graph Used_by JSON API)
11 when 'persistent', 'cache'
12 persist_links = Link.filter([['owner_uuid', '=', current_user.uuid],
13 ['link_class', '=', 'resources'],
14 ['name', '=', 'wants'],
15 ['tail_uuid', '=', current_user.uuid],
16 ['head_uuid', '=', @object.uuid]])
17 logger.debug persist_links.inspect
19 return unprocessable "Invalid value #{value.inspect}"
21 if params[:value] == 'persistent'
22 if not persist_links.any?
23 Link.create(link_class: 'resources',
25 tail_uuid: current_user.uuid,
26 head_uuid: @object.uuid)
29 persist_links.each do |link|
35 f.json { render json: @object }
40 if params[:search].andand.length.andand > 0
41 tags = Link.where(any: ['contains', params[:search]])
42 @collections = (Collection.where(uuid: tags.collect(&:head_uuid)) |
43 Collection.where(any: ['contains', params[:search]])).
47 limit = params[:limit].to_i
53 offset = params[:offset].to_i
58 @collections = Collection.limit(limit).offset(offset)
60 @links = Link.limit(1000).
61 where(head_uuid: @collections.collect(&:uuid))
63 @collections.each do |c|
64 @collection_info[c.uuid] = {
73 @collection_info[link.head_uuid] ||= {}
74 info = @collection_info[link.head_uuid]
77 info[:tag_links] << link
80 info[:wanted_by_me] ||= link.tail_uuid == current_user.uuid
82 info[:provenance] << link.name
86 @request_url = request.url
90 opts = params.merge(arvados_api_token: Thread.current[:arvados_api_token])
91 if r = params[:file].match(/(\.\w+)/)
94 self.response.headers['Content-Type'] =
95 Rack::Mime::MIME_TYPES[ext] || 'application/octet-stream'
96 self.response.headers['Content-Length'] = params[:size] if params[:size]
97 self.response.headers['Content-Disposition'] = params[:disposition] if params[:disposition]
98 self.response_body = file_enumerator opts
102 return super if !@object
105 @output2colorindex = {}
106 @sourcedata = {params[:uuid] => {uuid: params[:uuid]}}
112 any_hope_left = false
113 Job.where(output: @sourcedata.keys).sort_by { |a| a.finished_at || a.created_at }.reverse.each do |job|
114 if !@output2colorindex[job.output]
116 @output2colorindex[job.output] = (colorindex += 1) % 10
117 @provenance << {job: job, output: job.output}
118 @sourcedata.delete job.output
119 @output2job[job.output] = job
120 job.dependencies.each do |new_source_data|
121 unless @output2colorindex[new_source_data]
122 @sourcedata[new_source_data] = {uuid: new_source_data}
129 Link.where(head_uuid: @sourcedata.keys | @output2job.keys).each do |link|
130 if link.link_class == 'resources' and link.name == 'wants'
131 @protected[link.head_uuid] = true
132 if link.tail_uuid == current_user.uuid
133 @is_persistent = true
137 Link.where(tail_uuid: @sourcedata.keys).each do |link|
138 if link.link_class == 'data_origin'
139 @sourcedata[link.tail_uuid][:data_origins] ||= []
140 @sourcedata[link.tail_uuid][:data_origins] << [link.name, link.head_uuid]
143 Collection.where(uuid: @sourcedata.keys).each do |collection|
144 if @sourcedata[collection.uuid]
145 @sourcedata[collection.uuid][:collection] = collection
149 Collection.where(uuid: @object.uuid).each do |u|
151 @prov_svg = ProvenanceHelper::create_provenance_graph(u.provenance, "provenance_svg",
152 {:request => request,
153 :direction => :bottom_up,
154 :combine_jobs => :script_only}) rescue nil
155 @used_by_svg = ProvenanceHelper::create_provenance_graph(u.used_by, "used_by_svg",
156 {:request => request,
157 :direction => :top_down,
158 :combine_jobs => :script_only,
159 :pdata_only => true}) rescue nil
165 def file_enumerator(opts)
166 FileStreamer.new opts
170 def initialize(opts={})
174 return unless @opts[:uuid] && @opts[:file]
177 'ARVADOS_API_HOST' =>
178 $arvados_api_client.arvados_v1_base.
179 sub(/\/arvados\/v1/, '').
180 sub(/^https?:\/\//, ''),
181 'ARVADOS_API_TOKEN' =>
182 @opts[:arvados_api_token],
183 'ARVADOS_API_HOST_INSECURE' =>
184 Rails.configuration.arvados_insecure_https ? 'true' : 'false'
186 IO.popen([env, 'arv-get', "#{@opts[:uuid]}/#{@opts[:file]}"],
188 while buf = io.read(2**20)
192 Rails.logger.warn("#{@opts[:uuid]}/#{@opts[:file]}: #{$?}") if $? != 0