improve loading of distributions from api
[opensuse:software-o-o.git] / app / controllers / application_controller.rb
1 # Filters added to this controller apply to all controllers in the application.
2 # Likewise, all the methods added will be available for all controllers.
3
4 class ApplicationController < ActionController::Base
5
6   before_filter :set_distributions
7   before_filter :set_language
8
9   init_gettext('software')
10
11   def rescue_action_in_public(exception)
12     @message = exception.message
13     if request.xhr?
14       render :template => "error", :layout => false, :status => 404
15     else
16       render :template => 'error', :layout => "application", :status => 404
17     end
18   end
19
20   private
21
22   def set_language
23     if params[:lang].nil?
24       lang = request.compatible_language_from(LANGUAGES) || "en"
25     else
26       lang = params[:lang][0].gsub(/\-/, '_')
27     end
28     @lang = lang
29     GetText.locale = lang
30   end
31
32
33   def set_distributions
34     @distributions = Rails.cache.fetch('distributions', :expires_in => 120.minutes) do
35       load_distributions
36     end
37   end
38
39
40   # load available distributions
41   def load_distributions
42     uri = URI.parse("http://#{API_HOST}/distributions")
43     request = Net::HTTP::Get.new(uri.path)
44     logger.debug "Loading distributions from #{uri}"
45     @distributions = Array.new
46     begin
47       Net::HTTP.start(uri.host, uri.port) do |http|
48         http.read_timeout = 30
49         response = http.request(request)
50         unless( response.kind_of? Net::HTTPSuccess )
51           logger.error "Cannot load distributions: '#{response.code}', message: \n#{response.body}"
52         else
53           doc = REXML::Document.new response.body
54           doc.elements.each("distributions/distribution") { |element|
55             dist = [element.elements['name'].text, element.elements['project'].text]
56             @distributions << dist
57           }
58         end
59       end
60       @distributions << ["ALL", 'ALL']
61       return @distributions
62     rescue Exception => e
63       logger.error "Error while loading distributions from '#{uri}': " + e.to_s
64     end
65     return nil
66   end
67
68
69 end