merged cont.
[opensuse:yast-rest-service.git] / webservice / lib / yast / settings_model.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 'yast/config_file'
20
21 module YaST
22
23   # Base class for a model based on a
24   # config file with settings
25   #
26   # child classes need to reimplement
27   # config_name to let YaST::ConfigFile
28   # find the configuration
29   class SettingsModel
30
31     class << self
32       attr_accessor :config
33     end
34
35     def self.config_name
36       config
37     end
38
39     def self.config_name=(name)
40       self.config = YaST::ConfigFile.new(name)
41     end
42     
43     # initialize a model instance
44     def initialize(name)
45       @name = name
46     end
47
48     def self.path
49       self.config.path
50     end
51     
52     # find instances of the model
53     def self.find(what)
54       ret = nil
55       ret = case what
56         when :all then find_all
57         else find_one(what)
58       end
59     end
60
61     def self.find_all
62       ret = []
63       return ret if self.config.nil?
64       self.config.each do |key,val|
65         ret << self.new(key)
66       end
67       ret
68     end
69     
70     def self.find_one(id)
71       ret = nil
72       if self.config.has_key?(id.to_s)
73         ret = self.new(id.to_s)
74       end
75       ret
76     end
77     
78     # setting id, alias for name
79     def id
80       name.to_s
81     end
82   
83     # setting name
84     def name
85       @name.to_s
86     end
87
88     def value
89       self.class.config[name.to_s]
90     end
91
92     def self.method_missing(name)
93       # look if config has a key
94       if self.config.has_key?(name.to_s)
95         return self.config[name.to_s]
96       end
97       raise NoMethodError.new("undefined method `#{name}' for #{self.class.to_s}:Class")
98     end
99
100     def self.to_xml
101       tag_name = self.to_s.underscore
102       self.config.to_xml(:root => tag_name)
103     end
104
105     def self.to_json
106       self.config.to_json
107     end
108     
109     def to_xml(options = {})
110       fixed_value = value
111       # quick fix in case the value is an array
112       if value.is_a?(Array)
113         # convert something like [a,b,c] into [{ :foo => a }, { :foo => b }, ...]
114         fixed_value = value.map { |x| { name.singularize => x } }
115       end
116       { :name => name, :value => fixed_value }.to_xml({:root => self.class.to_s.underscore}.merge(options))
117     end
118
119     def to_json
120       self.class.config[name].to_json
121     end
122     
123   end
124   
125 end