Class: RbVmomi::TypeLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/rbvmomi/type_loader.rb

Instance Method Summary collapse

Constructor Details

#initialize(fn, extension_dirs, namespace) ⇒ TypeLoader

Returns a new instance of TypeLoader.



10
11
12
13
14
15
16
17
18
19
20
21
22
# 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

Instance Method Details

#add_types(types) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 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) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 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) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
53
54
# 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

#preloadObject



24
25
26
27
28
# 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_extensionsObject

Reload all extensions for loaded VMODL types



31
32
33
34
35
# 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) ⇒ Object

Reload all extensions for loaded VMODL types from the given directory



38
39
40
41
42
43
44
45
46
47
48
# 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

#typenamesObject



90
91
92
# File 'lib/rbvmomi/type_loader.rb', line 90

def typenames
  @db.keys
end