Class: Lutaml::Qea::Factory::GeneralizationBuilder

Inherits:
BaseTransformer show all
Defined in:
lib/lutaml/qea/factory/generalization_builder.rb

Instance Attribute Summary

Attributes inherited from BaseTransformer

#database

Instance Method Summary collapse

Methods inherited from BaseTransformer

#initialize, #transform, #transform_collection

Constructor Details

This class inherits a constructor from Lutaml::Qea::Factory::BaseTransformer

Instance Method Details

#base_attr_hash(attr) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 77

def base_attr_hash(attr)
  {
    id: attr.id,
    name: attr.name,
    type: attr.type,
    xmi_id: attr.xmi_id,
    cardinality: attr.cardinality,
    definition: attr.definition&.strip,
    association: attr.association,
    type_ns: attr.type_ns,
  }
end

#circular_inheritance?(object_id, visited) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
36
37
38
39
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 33

def circular_inheritance?(object_id, visited)
  return false unless visited.include?(object_id)

  warn "Circular inheritance detected for object_id #{object_id}, " \
       "stopping recursion"
  true
end

#convert_to_general_attributes(attributes) ⇒ Object



52
53
54
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 52

def convert_to_general_attributes(attributes)
  attributes.map { |attr| to_general_attribute(attr) }
end

#convert_to_top_element_attributes(attributes) ⇒ Object



56
57
58
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 56

def convert_to_top_element_attributes(attributes)
  attributes.map { |attr| to_top_element_attribute(attr) }
end

#load_association_generalizations(object_id) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 41

def load_association_generalizations(object_id)
  return [] if object_id.nil?

  gen_connectors = database.connectors_for_object(object_id)
    .select { |c| c.generalization? && c.start_object_id == object_id }

  gen_connectors.filter_map do |ea_connector|
    build_assoc_generalization(ea_connector)
  end
end

#load_generalization(object_id, visited = Set.new, is_leaf = true) ⇒ Object

rubocop:disable Style/OptionalBooleanParameter



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 12

def load_generalization(object_id, visited = Set.new, is_leaf = true) # rubocop:disable Style/OptionalBooleanParameter
  return nil if object_id.nil?
  return nil if circular_inheritance?(object_id, visited)

  visited = visited.dup.add(object_id)

  current_obj = find_object_by_id(object_id)
  return nil unless current_obj

  generalization = build_generalization(object_id, current_obj)
  return nil unless generalization

  populate_generalization_attrs(generalization, object_id)
  populate_parent_generalization(generalization,
                                 ea_connector_for(object_id), visited)

  collect_inherited_properties(generalization) if is_leaf && generalization.has_general

  generalization
end

#to_general_attribute(attr) ⇒ Object



60
61
62
63
64
65
66
67
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 60

def to_general_attribute(attr)
  base = base_attr_hash(attr)
  Lutaml::Uml::GeneralAttribute.new.tap do |gen_attr|
    base.each { |k, v| gen_attr.public_send(:"#{k}=", v) }
    gen_attr.is_derived = !!attr.is_derived
    gen_attr.has_association = !!attr.association
  end
end

#to_top_element_attribute(attr) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/lutaml/qea/factory/generalization_builder.rb', line 69

def to_top_element_attribute(attr)
  base = base_attr_hash(attr)
  Lutaml::Uml::TopElementAttribute.new.tap do |top_attr|
    base.each { |k, v| top_attr.public_send(:"#{k}=", v) }
    top_attr.is_derived = !!attr.is_derived
  end
end