Project

General

Profile

Download (4.38 KB) Statistics
| Branch: | Tag: | Revision:
1f9bfec2 Marc Dequènes (Duck)
#--
# LdapShadows, a Medium-level LDAP Access Library and Tool.
# Copyright (c) 2009 Marc Dequènes (Duck) <Duck@DuckCorp.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#++


$KCODE = 'UTF8'
require 'jcode'
require 'active_ldap'
require 'ldap_shadows/activeldap_fixes'
c331fe49 Marc Dequènes (Duck)
require 'facets/metaid'
90809ae4 Marc Dequènes (Duck)
require 'lib/ldap_shadows/elements'
1f9bfec2 Marc Dequènes (Duck)

module LdapShadows
c331fe49 Marc Dequènes (Duck)
module Shadows
end

1f9bfec2 Marc Dequènes (Duck)
class Shadow
attr_reader :name

def initialize(name)
@name = name

@config = Config.instance

c331fe49 Marc Dequènes (Duck)
# cannot use anonymous modules/classes, as active_ldap needs named classes for relations
90809ae4 Marc Dequènes (Duck)
module_name = "Shadow" + name.camelize
c331fe49 Marc Dequènes (Duck)
@container = LdapShadows::Shadows.module_eval(<<-EOS)
module #{module_name}; self; end
EOS

5a48a521 Marc Dequènes (Duck)
@container_elements = {}
1f9bfec2 Marc Dequènes (Duck)
@aspects = {}
end

bbe89518 Marc Dequènes (Duck)
def set_config(shadow_def_raw)
7f913647 Marc Dequènes (Duck)
@shadow_config = @config.parse_and_validate(@name, 'shadow', shadow_def_raw)
1f9bfec2 Marc Dequènes (Duck)
end

bbe89518 Marc Dequènes (Duck)
def get_config
@shadow_config
1f9bfec2 Marc Dequènes (Duck)
end

def add_aspect(aspect_name, aspect_def_raw)
5a48a521 Marc Dequènes (Duck)
e_type = 'aspect'
1f9bfec2 Marc Dequènes (Duck)
bbe89518 Marc Dequènes (Duck)
klass = add_container_element(e_type, aspect_name, aspect_def_raw)
a65fd5e8 Marc Dequènes (Duck)
5a48a521 Marc Dequènes (Duck)
# TODO: remove this crap
bbe89518 Marc Dequènes (Duck)
aspect_def = @config.parse_and_validate(aspect_name, e_type, aspect_def_raw)
c331fe49 Marc Dequènes (Duck)
@aspects[aspect_name.to_sym] = aspect_def
1f9bfec2 Marc Dequènes (Duck)
end

def get_aspect(aspect_name)
@aspects[aspect_name.to_sym]
end

def get_aspect_klass(aspect_name)
5a48a521 Marc Dequènes (Duck)
@container_elements['aspect'][aspect_name.to_s]
1f9bfec2 Marc Dequènes (Duck)
end

4b046f91 Marc Dequènes (Duck)
def add_object(object_name, object_def_raw)
5a48a521 Marc Dequènes (Duck)
e_type = 'object'
1f9bfec2 Marc Dequènes (Duck)
bbe89518 Marc Dequènes (Duck)
klass = add_container_element(e_type, object_name, object_def_raw)
1f9bfec2 Marc Dequènes (Duck)
5a48a521 Marc Dequènes (Duck)
# TODO: remove this crap
bbe89518 Marc Dequènes (Duck)
object_def = @config.parse_and_validate(object_name, e_type, object_def_raw)
klass.presentation = object_def[:presentation]
1f9bfec2 Marc Dequènes (Duck)
end

90809ae4 Marc Dequènes (Duck)
def get_object(object_name)
5a48a521 Marc Dequènes (Duck)
@container_elements['object'][object_name.to_s]
1f9bfec2 Marc Dequènes (Duck)
end

90809ae4 Marc Dequènes (Duck)
def cast
@container_elements.each_value do |e_models|
e_models.each_value do |e_klass|
e_klass.cast
1f9bfec2 Marc Dequènes (Duck)
end
90809ae4 Marc Dequènes (Duck)
end

@container_elements.each_value do |e_models|
e_models.each_value do |e_klass|
e_klass.cast_relations
1f9bfec2 Marc Dequènes (Duck)
end
end
end

def objects
5a48a521 Marc Dequènes (Duck)
@container_elements['object'].keys.sort
end

def aspects
@container_elements['aspect'].keys.sort
end

protected

bbe89518 Marc Dequènes (Duck)
def add_container_element(e_type, e_name, e_def_raw)
5a48a521 Marc Dequènes (Duck)
superklass_location = LdapShadows::Elements
90809ae4 Marc Dequènes (Duck)
superklass_name = 'Ldap' + e_type.camelize
5a48a521 Marc Dequènes (Duck)
unless superklass_location.const_defined?(superklass_name)
raise PreProcessingError, _("Element model '%s' does not exist") % e_type
end

90809ae4 Marc Dequènes (Duck)
klass_name = superklass_name + e_name.to_s.camelize
5a48a521 Marc Dequènes (Duck)
if @container.const_defined?(klass_name)
raise PreProcessingError, _("Element '%s' for model '%s' as already been defined") % [e_name, e_type]
end

90809ae4 Marc Dequènes (Duck)
e_def = @config.parse_and_validate(e_name, e_type, e_def_raw)

bbe89518 Marc Dequènes (Duck)
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)
90809ae4 Marc Dequènes (Duck)
klass.instance_variable_set(:@parameters, e_def)
bbe89518 Marc Dequènes (Duck)
klass.meta_eval do
90809ae4 Marc Dequènes (Duck)
attr_reader :handle, :shadow, :parameters
protected :parameters
bbe89518 Marc Dequènes (Duck)
end

begin
5a48a521 Marc Dequènes (Duck)
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
bbe89518 Marc Dequènes (Duck)
rescue
raise PreProcessingError, _("Could not create element '%s' for model '%s': %s") % [e_type, e_name, $!]
1f9bfec2 Marc Dequènes (Duck)
end
end
end