class RbVmomi::TypeLoader

Public Class Methods

new(fn, extension_dirs, namespace) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 10
def initialize fn, extension_dirs, namespace
  @extension_dirs = extension_dirs
  @namespace = namespace
  @lock = Monitor.new
  @db = {}
  @id2wsdl = {}
  @loaded = {}
  add_types Hash[BasicTypes::BUILTIN.map { |k| [k,nil] }]
  vmodl_database = File.open(fn, 'r') { |io| Marshal.load io }
  vmodl_database.reject! { |k,v| k =~ /^_/ }
  add_types vmodl_database
  preload
end

Public Instance Methods

add_types(types) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 74
def add_types types
  @lock.synchronize do
    @db.merge! types
    @db = Hash[@db.map do |name, value|
      if value
        value['wsdl_name'] ||= name
      end
      first_char = name[0].chr
      if first_char.downcase == first_char
        name = "%s%s" % [first_char.upcase, name[1..-1]]
      end
      [name, value]
    end]
  end
end
get(name) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 56
def get name
  fail "name '#{name}' is #{name.class} expecting String" unless name.is_a? String

  first_char = name[0].chr
  if first_char.downcase == first_char
    name = "%s%s" % [first_char.upcase, name[1..-1]]
  end

  return @loaded[name] if @loaded.member? name
  @lock.synchronize do
    return @loaded[name] if @loaded.member? name
    klass = make_type(name)
    @namespace.const_set name, klass
    load_extension name
    @loaded[name] = klass
  end
end
has?(name) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 50
def has? name
  fail unless name.is_a? String

  @db.member?(name) or BasicTypes::BUILTIN.member?(name)
end
preload() click to toggle source
# File lib/rbvmomi/type_loader.rb, line 24
def preload
  names = (@namespace.constants + Object.constants).map(&:to_s).uniq.
                                                    select { |x| has? x }
  names.each { |x| get(x) }
end
reload_extensions() click to toggle source

Reload all extensions for loaded VMODL types

# File lib/rbvmomi/type_loader.rb, line 31
def reload_extensions
  @extension_dirs.each do |path|
    reload_extensions_dir path
  end
end
reload_extensions_dir(path) click to toggle source

Reload all extensions for loaded VMODL types from the given directory

# File lib/rbvmomi/type_loader.rb, line 38
def reload_extensions_dir path
  loaded = Set.new(typenames.select { |x| @namespace.const_defined? x })
  Dir.open(path) do |dir|
    dir.each do |file|
      next unless file =~ /\.rb$/
      next unless loaded.member? $`
      file_path = File.join(dir, file)
      load file_path
    end
  end
end
typenames() click to toggle source
# File lib/rbvmomi/type_loader.rb, line 90
def typenames
  @db.keys
end

Private Instance Methods

load_extension(name) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 96
def load_extension name
  @extension_dirs.map { |x| File.join(x, "#{name}.rb") }.
                  select { |x| File.exist? x }.
                  each { |x| load x }
end
make_data_type(name, desc) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 114
def make_data_type name, desc
  superclass = get desc['wsdl_base']
  Class.new(superclass).tap do |klass|
    klass.init name, desc['props']
    klass.wsdl_name = desc['wsdl_name']
  end
end
make_enum_type(name, desc) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 130
def make_enum_type name, desc
  Class.new(BasicTypes::Enum).tap do |klass|
    klass.init name, desc['values']
    klass.wsdl_name = desc['wsdl_name']
  end
end
make_managed_type(name, desc) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 122
def make_managed_type name, desc
  superclass = get desc['wsdl_base']
  Class.new(superclass).tap do |klass|
    klass.init name, desc['props'], desc['methods']
    klass.wsdl_name = desc['wsdl_name']
  end
end
make_type(name) click to toggle source
# File lib/rbvmomi/type_loader.rb, line 102
def make_type name
  name = name.to_s
  return BasicTypes.const_get(name) if BasicTypes::BUILTIN.member? name
  desc = @db[name] or fail "unknown VMODL type #{name}"
  case desc['kind']
  when 'data' then make_data_type name, desc
  when 'managed' then make_managed_type name, desc
  when 'enum' then make_enum_type name, desc
  else fail desc.inspect
  end
end