1 class ActionsController < ApplicationController
4 def self.expose_action method, &block
5 @@exposed_actions[method] = true
6 define_method method, block
10 ArvadosBase::resource_class_for_uuid(params[:uuid])
14 @object = model_class.andand.find(params[:uuid])
15 if @object.is_a? Link and
16 @object.link_class == 'name' and
17 ArvadosBase::resource_class_for_uuid(@object.head_uuid) == Collection
18 redirect_to collection_path(id: @object.uuid)
22 raise ActiveRecord::RecordNotFound
27 params.keys.collect(&:to_sym).each do |param|
28 if @@exposed_actions[param]
29 return self.send(param)
35 expose_action :copy_selections_into_project do
39 expose_action :move_selections_into_project do
43 def move_or_copy action
44 uuids_to_add = params["selection"]
45 uuids_to_add = [ uuids_to_add ] unless uuids_to_add.is_a? Array
47 collect { |x| ArvadosBase::resource_class_for_uuid(x) }.
49 each do |resource_class|
50 resource_class.filter([['uuid','in',uuids_to_add]]).each do |src|
51 if resource_class == Collection and not Collection.attribute_info.include?(:name)
52 dst = Link.new(owner_uuid: @object.uuid,
53 tail_uuid: @object.uuid,
61 if dst.respond_to? :'name='
63 dst.name = "Copy of #{dst.name}"
65 dst.name = "Copy of unnamed #{dst.class_for_display.downcase}"
68 if resource_class == Collection
69 dst.manifest_text = Collection.select([:manifest_text]).where(uuid: src.uuid).first.manifest_text
74 raise ArgumentError.new "Unsupported action #{action}"
76 dst.owner_uuid = @object.uuid
77 dst.tail_uuid = @object.uuid if dst.class == Link
82 dst.name += " (#{Time.now.localtime})" if dst.respond_to? :name=
90 def arv_normalize mt, *opts
92 IO.popen(['arv-normalize'] + opts, 'w+b') do |io|
95 while buf = io.read(2**16)
102 expose_action :combine_selected_files_into_collection do
105 params["selection"].each do |s|
106 a = ArvadosBase::resource_class_for_uuid s
110 m = CollectionsHelper.match(Link.find(s).head_uuid)
114 m = CollectionsHelper.match(s)
117 if m and m[1] and m[2]
118 lst.append(m[1] + m[2])
123 collections = Collection.where(uuid: lst)
126 collections.each do |c|
133 mt = chash[m[1]+m[2]].manifest_text
135 combined += arv_normalize mt, '--extract', m[4][1..-1]
137 combined += chash[m[1]+m[2]].manifest_text
141 normalized = arv_normalize combined
142 normalized_stripped = arv_normalize combined, '--strip'
146 d = Digest::MD5.new()
147 d << normalized_stripped
148 newuuid = "#{d.hexdigest}+#{normalized_stripped.length}"
152 'ARVADOS_API_HOST' =>
153 arvados_api_client.arvados_v1_base.
154 sub(/\/arvados\/v1/, '').
155 sub(/^https?:\/\//, ''),
156 'ARVADOS_API_TOKEN' => Thread.current[:arvados_api_token],
157 'ARVADOS_API_HOST_INSECURE' =>
158 Rails.configuration.arvados_insecure_https ? 'true' : 'false'
161 IO.popen([env, 'arv-put', '--raw'], 'w+b') do |io|
162 io.write normalized_stripped
164 while buf = io.read(2**16)
168 newc = Collection.new({:uuid => newuuid, :manifest_text => normalized})
175 link_class: "provenance",
181 redirect_to controller: 'collections', action: :show, id: newc.uuid