merged cont.
[opensuse:yast-rest-service.git] / webyast / lib / plugin_job.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 require 'gettext_rails'
20
21 class PluginJob < Struct.new(:function_string)
22   def perform
23
24     #FIXME: this is a workaround only    
25     I18n.supported_locales = ["en"]
26
27     function_array = function_string.split(":")
28     raise "Invalid job entry: #{function_string}" if function_array.size < 2
29     function_class = function_array.shift.capitalize
30     function_method = function_array.shift
31     function_args = []
32     symbol_found = false
33     #building argument list. Evaluating symbols
34     function_array.each { |arg|
35       if arg.blank?
36         symbol_found = true  
37       else
38         if symbol_found
39           symbol_found = false
40           function_args << arg.to_sym
41         else
42           function_args << eval(arg) #translate it back to array,hash,string..
43         end
44       end
45     }
46     object = Object.const_get(function_class) rescue $!
47     if object.class != NameError && object.respond_to?(function_method)
48       Rails.logger.info "Calling job: #{function_class}:#{function_method}"
49       Rails.logger.info "             args: #{function_args.inspect}" unless function_args.blank?
50       Rails.cache.delete(function_string) #cache reset. This dedicates that
51                                           #the values has been re-read
52       ret = object.send(function_method, *function_args)
53       Rails.logger.info "Job returned"
54 #      Rails.logger.info "Job returns: #{ret.inspect}"
55       resources = Resource.find :all
56       resources.each  do |resource|
57         if resource.cache_reload_after > 0
58           name = resource.href.split("/").last
59           if YastCache.find_key(name) == function_string
60             Rails.logger.info "Enqueuing job again (sleep #{resource.cache_reload_after} seconds)"
61             Delayed::Job.enqueue(PluginJob.new(function_string), resource.cache_priority, 
62                                  (resource.cache_reload_after).seconds.from_now)
63           end
64         end
65       end
66     else
67       Rails.logger.error "Method #{function_class}:#{function_method} not available"
68     end
69   end    
70 end  
71