Project

General

Profile

« Previous | Next » 

Revision 90809ae4

Added by Marc Dequènes over 14 years ago

  • ID 90809ae4611daed224702e4f6083c42f9277a4a4

[cleanup] internal rework #2

View differences:

lib/ldap_shadows/shadow.rb
require 'active_ldap'
require 'ldap_shadows/activeldap_fixes'
require 'facets/metaid'
require 'ldap_shadows/elements/object'
require 'ldap_shadows/elements/aspect'
require 'lib/ldap_shadows/elements'
module LdapShadows
......
@config = Config.instance
# cannot use anonymous modules/classes, as active_ldap needs named classes for relations
module_name = "Shadow" + name.classify
module_name = "Shadow" + name.camelize
@container = LdapShadows::Shadows.module_eval(<<-EOS)
module #{module_name}; self; end
EOS
@container_elements = {}
@object_definitions = {}
@aspects = {}
end
......
# TODO: remove this crap
object_def = @config.parse_and_validate(object_name, e_type, object_def_raw)
klass.presentation = object_def[:presentation]
klass.ldap_mapping object_def[:mapping]
@object_definitions[object_name.to_sym] = object_def
end
def find_klass(object_name)
def get_object(object_name)
@container_elements['object'][object_name.to_s]
end
# run it _once_ when all objects are loaded
def load_relations
@object_definitions.each_pair do |object_name, object_def|
object_rel = {}
object_rel.merge!(object_def[:relations]) if object_def.include?(:relations)
if object_def[:presentation].has_key?(:allowed_aspects)
object_def[:presentation][:allowed_aspects].each do |aspect|
aspect_data = get_aspect(aspect)
if aspect_data.nil?
raise PreProcessingError, _("Aspect '%s' is missing") % aspect
end
object_rel.merge!(aspect_data[:relations]) if aspect_data.has_key?(:relations) and aspect_data[:relations]
end
def cast
@container_elements.each_value do |e_models|
e_models.each_value do |e_klass|
e_klass.cast
end
next if object_rel.empty?
klass = find_klass(object_name)
object_relations_info = {}
object_rel.each_pair do |field_name, rel|
foreign_klass = find_klass(rel[:object])
if foreign_klass.nil?
raise PreProcessingError, _("Relation '%s' for object '%s' is impossible: foreign object '%s' is missing") % [field_name, object_name, rel[:object]]
end
rel[:class_name] = foreign_klass.to_s
case rel[:type]
when 'belongs_to'
klass.belongs_to field_name, rel.reject {|key, val| not ActiveLdap::Associations::ClassMethods::VALID_BELONGS_TO_OPTIONS.include?(key) }
when 'has_many'
klass.has_many field_name, rel.reject {|key, val| not ActiveLdap::Associations::ClassMethods::VALID_HAS_MANY_OPTIONS.include?(key) }
else
raise "bug in '#{object_name}' object relations (wrong type)"
end
object_relations_info[field_name] = {
:foreign_klass => foreign_klass,
:single_value => ActiveLdap::Base.schema.attribute(rel[:foreign_key]).single_value?,
:read_only => rel[:read_only] || false
}
end
@container_elements.each_value do |e_models|
e_models.each_value do |e_klass|
e_klass.cast_relations
end
klass.relations_info = object_relations_info
end
end
......
def add_container_element(e_type, e_name, e_def_raw)
superklass_location = LdapShadows::Elements
superklass_name = 'Ldap' + e_type.classify
superklass_name = 'Ldap' + e_type.camelize
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
klass_name = superklass_name + e_name.to_s.camelize
if @container.const_defined?(klass_name)
raise PreProcessingError, _("Element '%s' for model '%s' as already been defined") % [e_name, e_type]
end
e_def = @config.parse_and_validate(e_name, e_type, e_def_raw)
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.instance_variable_set(:@parameters, e_def)
klass.meta_eval do
attr_reader :handle, :shadow
attr_reader :handle, :shadow, :parameters
protected :parameters
end
e_def = @config.parse_and_validate(e_name, e_type, e_def_raw)
klass.instance_variable_set(:@parameters, e_def)
begin
klass_content = @config.load_hook_content(@name, e_type, e_name)
klass.class_eval(klass_content) unless klass_content.nil?

Also available in: Unified diff