Module: Lutaml::UmlRepository::IndexBuilders::ClassIndex

Included in:
Lutaml::UmlRepository::IndexBuilder
Defined in:
lib/lutaml/uml_repository/index_builders/class_index.rb

Instance Method Summary collapse

Instance Method Details

#build_qualified_name_indexObject

Build the qualified name index

Creates a hash mapping qualified names to Class/DataType/Enum objects:

"ModelRoot::i-UR::urf::Building" => Class{}


12
13
14
15
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 12

def build_qualified_name_index
  index_document_classifiers
  index_package_classifiers
end

#build_stereotype_indexObject

Build the stereotype index

Creates a hash grouping classes by their stereotype:

"featureType" => [Class{}, Class{}],
"dataType" => [Class{}]


47
48
49
50
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 47

def build_stereotype_index
  index_document_stereotypes
  index_package_stereotypes
end

#has_stereotype?(classifier) ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 107

def has_stereotype?(classifier)
  classifier.stereotype && !classifier.stereotype.empty?
end

#index_by_stereotype(classifiers) ⇒ Object

Index classifiers by their stereotypes

Parameters:

  • classifiers (Array)

    Array of classifier objects



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 95

def index_by_stereotype(classifiers)
  return unless classifiers

  classifiers.each do |classifier|
    next unless has_stereotype?(classifier)

    Array(classifier.stereotype).each do |stereotype|
      (@stereotypes[stereotype] ||= []) << classifier
    end
  end
end

#index_classifier(classifier, package_path) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 80

def index_classifier(classifier, package_path)
  qualified_name = "#{package_path}::#{classifier.name}"
  @qualified_names[qualified_name] = classifier
  if classifier.xmi_id
    @class_to_qname[classifier.xmi_id] =
      qualified_name
  end
  @classes[classifier.xmi_id] = classifier if classifier.xmi_id
  (@simple_name_to_qnames[classifier.name] ||= []) << qualified_name
  (@package_to_classes[package_path] ||= []) << classifier
end

#index_classifiers(classifiers, package_path) ⇒ Object

Index classifiers (classes, data types, enums) by their qualified names

Parameters:

  • classifiers (Array)

    Array of classifier objects

  • package_path (String)

    Package path for these classifiers



70
71
72
73
74
75
76
77
78
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 70

def index_classifiers(classifiers, package_path)
  return unless classifiers

  classifiers.each do |classifier|
    next unless classifier.name

    index_classifier(classifier, package_path)
  end
end

#index_document_classifiersObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 17

def index_document_classifiers
  if @document.classes
    index_classifiers(@document.classes,
                      IndexBuilder::ROOT_PACKAGE_NAME)
  end
  if @document.data_types
    index_classifiers(@document.data_types,
                      IndexBuilder::ROOT_PACKAGE_NAME)
  end
  if @document.enums
    index_classifiers(@document.enums,
                      IndexBuilder::ROOT_PACKAGE_NAME)
  end
end

#index_document_stereotypesObject



52
53
54
55
56
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 52

def index_document_stereotypes
  index_by_stereotype(@document.classes) if @document.classes
  index_by_stereotype(@document.data_types) if @document.data_types
  index_by_stereotype(@document.enums) if @document.enums
end

#index_package_classifiersObject



32
33
34
35
36
37
38
39
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 32

def index_package_classifiers
  traverse_packages(@document.packages,
                    parent_path: IndexBuilder::ROOT_PACKAGE_NAME) do |package, path|
    index_classifiers(package.classes, path) if package.classes
    index_classifiers(package.data_types, path) if package.data_types
    index_classifiers(package.enums, path) if package.enums
  end
end

#index_package_stereotypesObject



58
59
60
61
62
63
64
# File 'lib/lutaml/uml_repository/index_builders/class_index.rb', line 58

def index_package_stereotypes
  traverse_packages(@document.packages) do |package, _path|
    index_by_stereotype(package.classes) if package.classes
    index_by_stereotype(package.data_types) if package.data_types
    index_by_stereotype(package.enums) if package.enums
  end
end