class RGen::Environment

An Environment is used to hold model elements.

Public Class Methods

new() click to toggle source
# File lib/rgen/environment.rb, line 7
    def initialize
            @elements = {}
            @subClasses = {}
            @subClassesUpdated = {}
@deleted = {}
@deletedClasses = {}
    end

Public Instance Methods

<<(el) click to toggle source

Add a model element. Returns the environment so << can be chained.

# File lib/rgen/environment.rb, line 17
def <<(el)
        clazz = el.class
        @elements[clazz] ||= []
        @elements[clazz] << el
        updateSubClasses(clazz)
        self
end
delete(el) click to toggle source

Removes model element from environment.

# File lib/rgen/environment.rb, line 26
    def delete(el)
@deleted[el] = true
@deletedClasses[el.class] = true
    end
each(&b) click to toggle source

Iterates each element

# File lib/rgen/environment.rb, line 33
    def each(&b)
removeDeleted
            @elements.values.flatten.each(&b)
    end
elements() click to toggle source

Return the elements of the environment as an array

# File lib/rgen/environment.rb, line 40
    def elements
removeDeleted
            @elements.values.flatten
    end
find(desc) click to toggle source

Finds and returns model elements in the environment.

The search description argument must be a hash specifying attribute/value pairs. Only model elements are returned which respond to the specified attribute methods and return the specified values as result of these attribute methods.

As a special hash key :class can be used to look for model elements of a specific class. In this case an array of possible classes can optionally be given.

# File lib/rgen/environment.rb, line 63
    def find(desc)
removeDeleted
            result = []
            classes = desc[:class] if desc[:class] and desc[:class].is_a?(Array)
            classes = [ desc[:class] ] if !classes and desc[:class]
            if classes
                    hashKeys = classesWithSubClasses(classes)
            else
                    hashKeys = @elements.keys
            end
            hashKeys.each do |clazz|
                    next unless @elements[clazz]
                    @elements[clazz].each do |e|
                            failed = false
                            desc.each_pair { |k,v|
                                    failed = true if k != :class and ( !e.respond_to?(k) or e.send(k) != v )
                            }
                            result << e unless failed
                    end
            end
            result
    end
new(clazz, *args) click to toggle source

This method can be used to instantiate a class and automatically put it into the environment. The new instance is returned.

# File lib/rgen/environment.rb, line 48
def new(clazz, *args)
        obj = clazz.new(*args)
        self << obj
        obj
end

Private Instance Methods

classesWithSubClasses(classes) click to toggle source
# File lib/rgen/environment.rb, line 111
def classesWithSubClasses(classes)
        result = classes
        classes.each do |c|
                result += @subClasses[c] if @subClasses[c]
        end
        result.uniq
end
removeDeleted() click to toggle source
# File lib/rgen/environment.rb, line 88
def removeDeleted
  @deletedClasses.keys.each do |c|
    @elements[c].reject!{|e| @deleted[e]}
  end
  @deletedClasses.clear
  @deleted.clear
end
superclasses(clazz) click to toggle source
# File lib/rgen/environment.rb, line 119
def superclasses(clazz)
        if clazz == Object
                []
        else
                superclasses(clazz.superclass) << clazz.superclass
        end
end
updateSubClasses(clazz) click to toggle source
# File lib/rgen/environment.rb, line 96
def updateSubClasses(clazz)
        return if @subClassesUpdated[clazz]
        if clazz.respond_to?( :ecore )
                superClasses = clazz.ecore.eAllSuperTypes.collect{|c| c.instanceClass}
        else
                superClasses = superclasses(clazz)
        end
        superClasses.each do |c|
                next if c == Object
                @subClasses[c] ||= []
                @subClasses[c] << clazz
        end
        @subClassesUpdated[clazz] = true
end