Revision 5a48a521
Added by Marc Dequènes over 14 years ago
- ID 5a48a5214365a057a5c7065c0e4a5b2cc833bff4
lib/ldap_shadows/shadow.rb | ||
---|---|---|
require 'active_ldap'
|
||
require 'ldap_shadows/activeldap_fixes'
|
||
require 'facets/metaid'
|
||
require 'ldap_shadows/object'
|
||
require 'ldap_shadows/aspect'
|
||
require 'ldap_shadows/elements/object'
|
||
require 'ldap_shadows/elements/aspect'
|
||
|
||
|
||
module LdapShadows
|
||
... | ... | |
@config = Config.instance
|
||
|
||
# cannot use anonymous modules/classes, as active_ldap needs named classes for relations
|
||
module_name = "Shadow" + name.capitalize
|
||
module_name = "Shadow" + name.classify
|
||
@container = LdapShadows::Shadows.module_eval(<<-EOS)
|
||
module #{module_name}; self; end
|
||
EOS
|
||
|
||
@objects = {}
|
||
@container_elements = {}
|
||
@object_definitions = {}
|
||
@aspects = {}
|
||
# TODO: should replace @aspects properly one day
|
||
@aspects2 = {}
|
||
end
|
||
|
||
def set_shadow_config(shadow_def_raw)
|
||
... | ... | |
end
|
||
|
||
def add_aspect(aspect_name, aspect_def_raw)
|
||
aspect_def = @config.parse_and_validate(aspect_name, 'aspect', aspect_def_raw)
|
||
klass_name = "LdapAspect" + aspect_name.to_s.capitalize
|
||
klass_content = @config.load_hook_content(@name, 'aspect', aspect_name)
|
||
e_type = 'aspect'
|
||
|
||
begin
|
||
klass = @container.module_eval(<<-EOS)
|
||
class #{klass_name} < LdapAspect; self; end
|
||
EOS
|
||
klass.instance_variable_set(:@handle, aspect_name)
|
||
klass.instance_variable_set(:@shadow, self)
|
||
klass.meta_eval do
|
||
attr_reader :handle, :shadow
|
||
end
|
||
klass.class_eval(klass_content) unless klass_content.nil?
|
||
rescue
|
||
raise PreProcessingError, _("Could not load Aspect plugin '%s': %s") % [aspect_name, $!]
|
||
end
|
||
klass = add_container_element(e_type, aspect_name)
|
||
aspect_def = @config.parse_and_validate(aspect_name, e_type, aspect_def_raw)
|
||
|
||
# TODO: remove this crap
|
||
@aspects[aspect_name.to_sym] = aspect_def
|
||
@aspects2[aspect_name] = klass
|
||
end
|
||
|
||
def get_aspect(aspect_name)
|
||
... | ... | |
end
|
||
|
||
def get_aspect_klass(aspect_name)
|
||
@aspects2[aspect_name]
|
||
@container_elements['aspect'][aspect_name.to_s]
|
||
end
|
||
|
||
def add_object(object_name, object_def_raw)
|
||
object_def = @config.parse_and_validate(object_name, 'object', object_def_raw)
|
||
klass_name = "LdapObject" + object_name.to_s.capitalize
|
||
klass_content = @config.load_hook_content(@name, 'object', object_name)
|
||
e_type = 'object'
|
||
|
||
begin
|
||
klass = @container.module_eval(<<-EOS)
|
||
class #{klass_name} < LdapObject; self; end
|
||
EOS
|
||
klass.instance_variable_set(:@handle, object_name)
|
||
klass.instance_variable_set(:@shadow, self)
|
||
klass.meta_eval do
|
||
attr_reader :handle, :shadow
|
||
end
|
||
klass.class_eval(klass_content) unless klass_content.nil?
|
||
rescue
|
||
raise PreProcessingError, _("Could not load Object plugin '%s': %s") % [object_name, $!]
|
||
end
|
||
|
||
# configure class
|
||
klass = add_container_element(e_type, object_name)
|
||
object_def = @config.parse_and_validate(object_name, 'object', object_def_raw)
|
||
klass.presentation = object_def[:presentation]
|
||
klass.ldap_mapping object_def[:mapping]
|
||
|
||
# store definition for later relations processing
|
||
# TODO: remove this crap
|
||
@object_definitions[object_name.to_sym] = object_def
|
||
@objects[object_name] = klass
|
||
end
|
||
|
||
def find_klass(object_name)
|
||
@objects[object_name.to_s]
|
||
@container_elements['object'][object_name.to_s]
|
||
end
|
||
|
||
# run it _once_ when all objects are loaded
|
||
... | ... | |
end
|
||
|
||
def objects
|
||
@objects.keys.sort
|
||
@container_elements['object'].keys.sort
|
||
end
|
||
|
||
def aspects
|
||
@container_elements['aspect'].keys.sort
|
||
end
|
||
|
||
protected
|
||
|
||
def add_container_element(e_type, e_name)
|
||
superklass_location = LdapShadows::Elements
|
||
superklass_name = 'Ldap' + e_type.classify
|
||
unless superklass_location.const_defined?(superklass_name)
|
||
raise PreProcessingError, _("Element model '%s' does not exist") % e_type
|
||
end
|
||
|
||
klass_name = superklass_name + e_name.to_s.classify
|
||
if @container.const_defined?(klass_name)
|
||
raise PreProcessingError, _("Element '%s' for model '%s' as already been defined") % [e_name, e_type]
|
||
end
|
||
|
||
begin
|
||
klass = @container.module_eval(<<-EOS)
|
||
class #{klass_name} < #{superklass_location}::#{superklass_name}; self; end
|
||
EOS
|
||
klass.instance_variable_set(:@handle, e_name)
|
||
klass.instance_variable_set(:@shadow, self)
|
||
klass.meta_eval do
|
||
attr_reader :handle, :shadow
|
||
end
|
||
|
||
klass_content = @config.load_hook_content(@name, e_type, e_name)
|
||
klass.class_eval(klass_content) unless klass_content.nil?
|
||
rescue
|
||
raise PreProcessingError, _("Could not load '%s' plugin for '%s': %s") % [e_type, e_name, $!]
|
||
end
|
||
|
||
@container_elements[e_type] ||= {}
|
||
@container_elements[e_type][e_name] = klass
|
||
|
||
klass
|
||
end
|
||
end
|
||
end
|
Also available in: Unified diff
[cleanup] improve elements classes generation (with a few more checks)