class Properties
Defines a properties object.
Attributes
force_json[RW]
props[RW]
use_prompt_handler[RW]
Public Class Methods
new()
click to toggle source
Initialize with some base values.
# File lib/tungsten/properties.rb, line 14 def initialize @props = {} # These hashes are used to prevent loops where the prompt handler needs # to get additional information from the configuration @in_prompt_handler = {} @in_template_value_prompt_handler = {} # The prompt handler provides a structuring for finding values # that do no exist in the props Hash. The prompt handler will calculate # default values or values based on parent defaults. @use_prompt_handler = false @prompt_handler = nil # This is used for translating the configuration from 1.3 deployments @force_json = true end
Public Instance Methods
append(key, value = [])
click to toggle source
# File lib/tungsten/properties.rb, line 454 def append(key, value = []) if value == nil || value == "" value = [] end if ! value.kind_of?(Array) value=Array(value) end currentvalue=getNestedPropertyOr(key, []) if ! currentvalue.kind_of?(Array) currentvalue=Array(currentvalue) end setProperty(key, (currentvalue+value).uniq()) end
empty?()
click to toggle source
# File lib/tungsten/properties.rb, line 434 def empty? (@props.size() == 0) end
force_output()
click to toggle source
# File lib/tungsten/properties.rb, line 169 def force_output() TU.force_output(self.to_s) end
getNestedProperty(attrs)
click to toggle source
Fetch a nested hash value
# File lib/tungsten/properties.rb, line 174 def getNestedProperty(attrs) if attrs.is_a?(String) attrs = attrs.split('.') end attr_count = attrs.size current_val = @props for i in 0..(attr_count-1) attr_name = attrs[i] return current_val[attr_name] if i == (attr_count-1) return nil if current_val[attr_name].nil? current_val = current_val[attr_name] end return nil end
getNestedPropertyOr(key, default = "")
click to toggle source
# File lib/tungsten/properties.rb, line 372 def getNestedPropertyOr(key, default = "") value = getNestedProperty(key) if value == nil default else value end end
getPromptHandler()
click to toggle source
# File lib/tungsten/properties.rb, line 422 def getPromptHandler unless usePromptHandler() return nil end unless @prompt_handler @prompt_handler = ConfigurePromptHandler.new(self) end return @prompt_handler end
getProperty(key, allow_disabled = false)
click to toggle source
Get a property value.
# File lib/tungsten/properties.rb, line 220 def getProperty(key, allow_disabled = false) if key.is_a?(String) key_string = key key = key.split('.') else key_string = key.join('.') end value = getNestedProperty(key) if value != nil return value end if usePromptHandler() findProperty = lambda do |keys| if @in_prompt_handler[key_string] == true return nil end begin @in_prompt_handler[key_string] = true value = getPromptHandler().get_property(keys, allow_disabled) @in_prompt_handler[key_string] = false rescue IgnoreError @in_prompt_handler[key_string] = false rescue => e @in_prompt_handler[key_string] = false raise e end return value end value = findProperty.call(key) else findProperty = lambda do |keys| return getNestedProperty(keys) end end if value == nil && key.size == 1 && (host = getNestedProperty([DEPLOYMENT_HOST])) value = findProperty.call([HOSTS, host, key[0]]) if value == nil && key.size == 1 dataservice = getProperty(DEPLOYMENT_DATASERVICE) if dataservice value = findProperty.call([DATASERVICES, dataservice, key[0]]) if value == nil value = findProperty.call([REPL_SERVICES, dataservice + "_" + host, key[0]]) end if value == nil value = findProperty.call([MANAGERS, dataservice + "_" + host, key[0]]) end end end if value == nil value = findProperty.call([CONNECTORS, host, key[0]]) end if value == nil && key.size == 1 && (svc = getNestedProperty([DEPLOYMENT_SERVICE])) value = findProperty.call([REPL_SERVICES, svc, key[0]]) end end value end
getPropertyOr(key, default = "")
click to toggle source
Get the property value or return the default if nil
# File lib/tungsten/properties.rb, line 363 def getPropertyOr(key, default = "") value = getProperty(key) if value == nil default else value end end
getTemplateValue(key)
click to toggle source
Get the config file value for a property.
# File lib/tungsten/properties.rb, line 295 def getTemplateValue(key) if key.is_a?(String) key_string = key key = key.split('.') else key_string = key.join('.') end if usePromptHandler() findProperty = lambda do |keys| if @in_template_value_prompt_handler[key_string] == true return nil end begin @in_template_value_prompt_handler[key_string] = true value = getPromptHandler().find_template_value(keys) @in_template_value_prompt_handler[key_string] = false rescue IgnoreError @in_template_value_prompt_handler[key_string] = false rescue => e @in_template_value_prompt_handler[key_string] = false raise e end return value end value = findProperty.call(key) end if value == nil && key.size == 1 && (host = getNestedProperty([DEPLOYMENT_HOST])) value = findProperty.call([HOSTS, host, key[0]]) if value == nil && key.size == 1 dataservice = getNestedProperty([DEPLOYMENT_DATASERVICE]) if dataservice == nil dataservice = getProperty(DEPLOYMENT_DATASERVICE) end if dataservice value = findProperty.call([DATASERVICES, dataservice, key[0]]) if value == nil value = findProperty.call([REPL_SERVICES, dataservice + "_" + host, key[0]]) end if value == nil value = findProperty.call([MANAGERS, dataservice + "_" + host, key[0]]) end end end if value == nil value = findProperty.call([CONNECTORS, host, key[0]]) end end if value == nil && key.size == 1 && (svc = getNestedProperty([DEPLOYMENT_SERVICE])) value = findProperty.call([REPL_SERVICES, svc, key[0]]) end value end
hash()
click to toggle source
Get the underlying hash table.
# File lib/tungsten/properties.rb, line 414 def hash() @props end
import(properties_obj = {})
click to toggle source
# File lib/tungsten/properties.rb, line 113 def import(properties_obj = {}) if properties_obj.instance_of?(Hash) self.props = properties_obj elsif properties_obj.instance_of?(Properties) self.props = properties_obj.props else raise "You must pass in a Hash or Properties object to import" end end
include(key, value = {})
click to toggle source
# File lib/tungsten/properties.rb, line 446 def include(key, value = {}) if value == nil || value == "" value = {} end setProperty(key, value.merge(getNestedPropertyOr(key, {}))) end
initialize_copy(source)
click to toggle source
Calls superclass method
# File lib/tungsten/properties.rb, line 32 def initialize_copy(source) super(source) @props = Marshal::load(Marshal::dump(@props)) @in_prompt_handler = {} @in_template_value_prompt_handler = {} @use_prompt_handler = source.use_prompt_handler @prompt_handler = nil @force_json = source.force_json end
load(properties_filename)
click to toggle source
Read properties from a file.
# File lib/tungsten/properties.rb, line 43 def load(properties_filename) file_contents = "" File.open(properties_filename, 'r') do |file| file.read.each_line do |line| line.strip! unless (line =~ /^#.*/) file_contents = file_contents + line end end begin parsed_contents = JSON.parse(file_contents) rescue Exception => e if file_contents == "" parsed_contents = {} elsif file_contents[0,1] == "{" raise "There was an error parsing the config file: #{e.message}" end end if parsed_contents && parsed_contents.instance_of?(Hash) @props = parsed_contents elsif @force_json == true raise "There was an error parsing the JSON config file: #{properties_filename}. Try using the migration procedure if you have an old configuration file." else new_props = {} file.rewind() file.read.each_line do |line| line.strip! if (line =~ /^([\w\.]+)\[?([\w\.]+)?\]?\s*=\s*(\S.*)/) key = $1 value = $3 if $2 new_props[key] = {} unless new_props[key] new_props[key][$2] = value else new_props[key] = value end elsif (line =~ /^([\w\.]+)\s*=/) key = $1 value = "" new_props[key] = value end end @props = new_props end original_props = @props.dup if original_props != @props Configurator.instance.warning("Deprecated keys in the config file were updated") end end end
load_and_initialize(properties_filename, keys_module)
click to toggle source
Read properties from a file.
# File lib/tungsten/properties.rb, line 104 def load_and_initialize(properties_filename, keys_module) load(properties_filename) init(keys_module) end
output()
click to toggle source
# File lib/tungsten/properties.rb, line 165 def output() TU.output(self.to_s) end
override(key, value = {})
click to toggle source
# File lib/tungsten/properties.rb, line 438 def override(key, value = {}) if value == nil || value == "" value = {} end setProperty(key, getNestedPropertyOr(key, {}).merge(value)) end
reset()
click to toggle source
# File lib/tungsten/properties.rb, line 109 def reset self.props = {} end
setDefault(key, value)
click to toggle source
Set the property to a value only if it is currently unset.
# File lib/tungsten/properties.rb, line 391 def setDefault(key, value) if key.is_a?(String) key = key.split('.') end if getNestedProperty(key) == nil setNestedProperty(value, key) end end
setHashProperty(hash, key, value)
click to toggle source
# File lib/tungsten/properties.rb, line 204 def setHashProperty(hash, key, value) if value == nil || value == [] return (hash.delete(key)) else if value.is_a?(Hash) hash[key] ||= {} value.each{|sub_key,sub_value| setHashProperty(hash[key], sub_key, sub_value) } else return (hash[key] = value) end end end
setNestedProperty(new_val, attrs)
click to toggle source
# File lib/tungsten/properties.rb, line 191 def setNestedProperty(new_val, attrs) attr_count = attrs.size current_val = @props for i in 0..(attr_count-1) attr_name = attrs[i] if i == (attr_count-1) return setHashProperty(current_val, attr_name, new_val) end current_val[attr_name] = {} if current_val[attr_name].nil? current_val = current_val[attr_name] end end
setPropertiesFromList(list, delimiter)
click to toggle source
Set multiple properties from a delimited string of key value pairs.
# File lib/tungsten/properties.rb, line 402 def setPropertiesFromList(list, delimiter) keyValuePairs = list.split(delimiter) keyValuePairs.each do |pair| if pair =~ /^(.*)=(.*)$/ key = $1 value = $2 setProperty(key, value) end end end
setProperty(key, value)
click to toggle source
Set a property value.
# File lib/tungsten/properties.rb, line 382 def setProperty(key, value) if key.is_a?(String) key = key.split('.') end setNestedProperty(value, key) end
size()
click to toggle source
Return the size of the properties object.
# File lib/tungsten/properties.rb, line 157 def size() @props.size end
store(properties_filename, use_json = true)
click to toggle source
Write properties to a file. We use signal protection to avoid getting interrupted half-way through.
# File lib/tungsten/properties.rb, line 125 def store(properties_filename, use_json = true) # Protect I/O with trap for Ctrl-C. interrupted = false old_trap = trap("INT") { interrupted = true; } # Write. File.open(properties_filename, 'w') do |file| file.printf "# Tungsten configuration properties\n" file.printf "# Date: %s\n", DateTime.now if use_json == false @props.sort.each do | key, value | file.printf "%s=%s\n", key, value end else file.print self.to_s end end # Check for interrupt and restore handler. if (interrupted) puts puts ("Configuration interrupted") exit 1; else trap("INT", old_trap); end end
to_s()
click to toggle source
# File lib/tungsten/properties.rb, line 161 def to_s JSON.pretty_generate(@props) end
usePromptHandler()
click to toggle source
# File lib/tungsten/properties.rb, line 418 def usePromptHandler return @use_prompt_handler end