archimate 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +47 -0
  3. data/TODOs.org +219 -0
  4. data/archimate.gemspec +2 -1
  5. data/exe/archidiff +7 -0
  6. data/exe/archidiff-summary +7 -0
  7. data/exe/archimerge +7 -0
  8. data/exe/fmtxml +7 -0
  9. data/lib/archimate.rb +10 -21
  10. data/lib/archimate/cli/archi.rb +2 -1
  11. data/lib/archimate/cli/cleanup.rb +8 -9
  12. data/lib/archimate/cli/convert.rb +3 -1
  13. data/lib/archimate/cli/mapper.rb +1 -1
  14. data/lib/archimate/cli/stats.rb +1 -1
  15. data/lib/archimate/config.rb +4 -1
  16. data/lib/archimate/data_model.rb +11 -24
  17. data/lib/archimate/data_model/any_attribute.rb +18 -5
  18. data/lib/archimate/data_model/any_element.rb +30 -7
  19. data/lib/archimate/data_model/bounds.rb +34 -7
  20. data/lib/archimate/data_model/color.rb +32 -7
  21. data/lib/archimate/data_model/comparison.rb +87 -0
  22. data/lib/archimate/data_model/concern.rb +20 -7
  23. data/lib/archimate/data_model/connection.rb +71 -51
  24. data/lib/archimate/data_model/connector_type.rb +23 -0
  25. data/lib/archimate/data_model/diagram.rb +72 -10
  26. data/lib/archimate/data_model/diagram_type.rb +17 -0
  27. data/lib/archimate/data_model/differentiable.rb +142 -0
  28. data/lib/archimate/data_model/element.rb +39 -45
  29. data/lib/archimate/data_model/element_type.rb +89 -0
  30. data/lib/archimate/data_model/font.rb +30 -12
  31. data/lib/archimate/data_model/lang_string.rb +89 -16
  32. data/lib/archimate/data_model/layer.rb +55 -0
  33. data/lib/archimate/data_model/layers.rb +62 -0
  34. data/lib/archimate/data_model/location.rb +27 -11
  35. data/lib/archimate/data_model/metadata.rb +10 -3
  36. data/lib/archimate/data_model/model.rb +188 -121
  37. data/lib/archimate/data_model/modeling_note.rb +14 -3
  38. data/lib/archimate/data_model/organization.rb +44 -13
  39. data/lib/archimate/data_model/{documentation.rb → preserved_lang_string.rb} +1 -5
  40. data/lib/archimate/data_model/property.rb +17 -11
  41. data/lib/archimate/data_model/property_definition.rb +34 -4
  42. data/lib/archimate/data_model/referenceable.rb +0 -9
  43. data/lib/archimate/data_model/referenceable_collection.rb +201 -0
  44. data/lib/archimate/data_model/relationship.rb +52 -33
  45. data/lib/archimate/data_model/relationship_type.rb +43 -0
  46. data/lib/archimate/data_model/schema_info.rb +17 -6
  47. data/lib/archimate/data_model/style.rb +41 -11
  48. data/lib/archimate/data_model/view_node.rb +153 -59
  49. data/lib/archimate/data_model/viewpoint.rb +56 -80
  50. data/lib/archimate/data_model/viewpoint_type.rb +429 -0
  51. data/lib/archimate/export/csv_export.rb +2 -2
  52. data/lib/archimate/export/cypher.rb +2 -2
  53. data/lib/archimate/export/graph_ml.rb +7 -5
  54. data/lib/archimate/export/jsonl.rb +166 -0
  55. data/lib/archimate/export/n_quads.rb +8 -5
  56. data/lib/archimate/file_format.rb +4 -5
  57. data/lib/archimate/file_formats/archi_file_reader.rb +7 -240
  58. data/lib/archimate/file_formats/archi_file_writer.rb +16 -188
  59. data/lib/archimate/file_formats/model_exchange_file_reader.rb +7 -225
  60. data/lib/archimate/file_formats/model_exchange_file_writer_21.rb +22 -114
  61. data/lib/archimate/file_formats/model_exchange_file_writer_30.rb +22 -122
  62. data/lib/archimate/file_formats/sax.rb +55 -0
  63. data/lib/archimate/file_formats/sax/any_element.rb +64 -0
  64. data/lib/archimate/file_formats/sax/archi/archi_handler_factory.rb +48 -0
  65. data/lib/archimate/file_formats/sax/archi/bounds.rb +25 -0
  66. data/lib/archimate/file_formats/sax/archi/connection.rb +47 -0
  67. data/lib/archimate/file_formats/sax/archi/content.rb +28 -0
  68. data/lib/archimate/file_formats/sax/archi/diagram.rb +66 -0
  69. data/lib/archimate/file_formats/sax/archi/element.rb +36 -0
  70. data/lib/archimate/file_formats/sax/archi/location.rb +25 -0
  71. data/lib/archimate/file_formats/sax/archi/model.rb +109 -0
  72. data/lib/archimate/file_formats/sax/archi/organization.rb +60 -0
  73. data/lib/archimate/file_formats/sax/archi/property.rb +54 -0
  74. data/lib/archimate/file_formats/sax/archi/relationship.rb +50 -0
  75. data/lib/archimate/file_formats/sax/archi/style.rb +35 -0
  76. data/lib/archimate/file_formats/sax/archi/view_node.rb +76 -0
  77. data/lib/archimate/file_formats/sax/capture_content.rb +20 -0
  78. data/lib/archimate/file_formats/sax/capture_documentation.rb +19 -0
  79. data/lib/archimate/file_formats/sax/capture_properties.rb +20 -0
  80. data/lib/archimate/file_formats/sax/content_element.rb +19 -0
  81. data/lib/archimate/file_formats/sax/document.rb +80 -0
  82. data/lib/archimate/file_formats/sax/handler.rb +54 -0
  83. data/lib/archimate/file_formats/sax/lang_string.rb +28 -0
  84. data/lib/archimate/file_formats/sax/model_exchange_file/color.rb +36 -0
  85. data/lib/archimate/file_formats/sax/model_exchange_file/connection.rb +67 -0
  86. data/lib/archimate/file_formats/sax/model_exchange_file/diagram.rb +60 -0
  87. data/lib/archimate/file_formats/sax/model_exchange_file/element.rb +43 -0
  88. data/lib/archimate/file_formats/sax/model_exchange_file/font.rb +44 -0
  89. data/lib/archimate/file_formats/sax/model_exchange_file/item.rb +64 -0
  90. data/lib/archimate/file_formats/sax/model_exchange_file/location.rb +23 -0
  91. data/lib/archimate/file_formats/sax/model_exchange_file/metadata.rb +66 -0
  92. data/lib/archimate/file_formats/sax/model_exchange_file/model.rb +124 -0
  93. data/lib/archimate/file_formats/sax/model_exchange_file/model_exchange_handler_factory.rb +53 -0
  94. data/lib/archimate/file_formats/sax/model_exchange_file/property.rb +32 -0
  95. data/lib/archimate/file_formats/sax/model_exchange_file/property_definition.rb +36 -0
  96. data/lib/archimate/file_formats/sax/model_exchange_file/relationship.rb +49 -0
  97. data/lib/archimate/file_formats/sax/model_exchange_file/schema_info.rb +47 -0
  98. data/lib/archimate/file_formats/sax/model_exchange_file/style.rb +66 -0
  99. data/lib/archimate/file_formats/sax/model_exchange_file/view_node.rb +86 -0
  100. data/lib/archimate/file_formats/sax/no_op.rb +17 -0
  101. data/lib/archimate/file_formats/sax/preserved_lang_string.rb +28 -0
  102. data/lib/archimate/file_formats/serializer.rb +57 -0
  103. data/lib/archimate/file_formats/serializer/archi/bounds.rb +23 -0
  104. data/lib/archimate/file_formats/serializer/archi/connection.rb +33 -0
  105. data/lib/archimate/file_formats/serializer/archi/diagram.rb +28 -0
  106. data/lib/archimate/file_formats/serializer/archi/documentation.rb +16 -0
  107. data/lib/archimate/file_formats/serializer/archi/element.rb +24 -0
  108. data/lib/archimate/file_formats/serializer/archi/location.rb +26 -0
  109. data/lib/archimate/file_formats/serializer/archi/model.rb +25 -0
  110. data/lib/archimate/file_formats/serializer/archi/organization.rb +21 -0
  111. data/lib/archimate/file_formats/serializer/archi/property.rb +15 -0
  112. data/lib/archimate/file_formats/serializer/archi/relationship.rb +36 -0
  113. data/lib/archimate/file_formats/serializer/archi/view_node.rb +52 -0
  114. data/lib/archimate/file_formats/serializer/archi/viewpoint_type.rb +45 -0
  115. data/lib/archimate/file_formats/serializer/model_exchange_file/element.rb +25 -0
  116. data/lib/archimate/file_formats/serializer/model_exchange_file/location.rb +15 -0
  117. data/lib/archimate/file_formats/serializer/model_exchange_file/model_exchange_file_writer.rb +32 -0
  118. data/lib/archimate/file_formats/serializer/model_exchange_file/organization.rb +23 -0
  119. data/lib/archimate/file_formats/serializer/model_exchange_file/properties.rb +15 -0
  120. data/lib/archimate/file_formats/serializer/model_exchange_file/relationship.rb +19 -0
  121. data/lib/archimate/file_formats/serializer/model_exchange_file/style.rb +48 -0
  122. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/connection.rb +25 -0
  123. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/diagram.rb +27 -0
  124. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/item.rb +17 -0
  125. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/label.rb +17 -0
  126. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/model.rb +36 -0
  127. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/organization_body.rb +25 -0
  128. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/property.rb +19 -0
  129. data/lib/archimate/file_formats/serializer/model_exchange_file/v21/view_node.rb +44 -0
  130. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/connection.rb +26 -0
  131. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/diagram.rb +27 -0
  132. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/item.rb +17 -0
  133. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/label.rb +17 -0
  134. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/model.rb +41 -0
  135. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/organization_body.rb +25 -0
  136. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property.rb +19 -0
  137. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/property_definitions.rb +34 -0
  138. data/lib/archimate/file_formats/serializer/model_exchange_file/v30/view_node.rb +45 -0
  139. data/lib/archimate/file_formats/serializer/named_collection.rb +21 -0
  140. data/lib/archimate/file_formats/serializer/writer.rb +56 -0
  141. data/lib/archimate/file_formats/serializer/xml_lang_string.rb +30 -0
  142. data/lib/archimate/file_formats/serializer/xml_metadata.rb +64 -0
  143. data/lib/archimate/file_formats/{model_exchange_file → serializer}/xml_property_defs.rb +2 -2
  144. data/lib/archimate/lint/duplicate_entities.rb +3 -3
  145. data/lib/archimate/lint/linter.rb +24 -29
  146. data/lib/archimate/svg/connection.rb +13 -103
  147. data/lib/archimate/svg/diagram.rb +1 -1
  148. data/lib/archimate/svg/entity/base_entity.rb +12 -8
  149. data/lib/archimate/svg/entity/data_entity.rb +2 -2
  150. data/lib/archimate/svg/entity/diagram_model_reference.rb +1 -1
  151. data/lib/archimate/svg/entity/event_entity.rb +2 -2
  152. data/lib/archimate/svg/entity/gap.rb +1 -1
  153. data/lib/archimate/svg/entity/group.rb +1 -1
  154. data/lib/archimate/svg/entity/motivation_entity.rb +1 -1
  155. data/lib/archimate/svg/entity/node.rb +1 -1
  156. data/lib/archimate/svg/entity/rect_entity.rb +1 -1
  157. data/lib/archimate/svg/entity/rounded_rect_entity.rb +1 -1
  158. data/lib/archimate/svg/entity/service_entity.rb +2 -2
  159. data/lib/archimate/svg/entity/value.rb +2 -2
  160. data/lib/archimate/svg/path.rb +153 -0
  161. data/lib/archimate/svg/point.rb +8 -1
  162. data/lib/archimate/version.rb +1 -1
  163. metadata +118 -36
  164. data/lib/archimate/data_model/archimate_node.rb +0 -181
  165. data/lib/archimate/data_model/concept.rb +0 -14
  166. data/lib/archimate/data_model/constants.rb +0 -82
  167. data/lib/archimate/data_model/container.rb +0 -17
  168. data/lib/archimate/data_model/diffable_array.rb +0 -213
  169. data/lib/archimate/data_model/diffable_primitive.rb +0 -83
  170. data/lib/archimate/data_model/label.rb +0 -19
  171. data/lib/archimate/data_model/named_referenceable.rb +0 -14
  172. data/lib/archimate/data_model/view.rb +0 -12
  173. data/lib/archimate/data_model/view_concept.rb +0 -18
  174. data/lib/archimate/file_formats/archi_file_format.rb +0 -151
  175. data/lib/archimate/file_formats/archimate_v2.rb +0 -461
  176. data/lib/archimate/file_formats/model_exchange_file/xml_lang_string.rb +0 -35
  177. data/lib/archimate/file_formats/model_exchange_file/xml_metadata.rb +0 -115
  178. data/lib/archimate/file_formats/model_exchange_file/xml_property_definitions.rb +0 -28
  179. data/lib/archimate/file_formats/model_exchange_file_reader_21.rb +0 -73
  180. data/lib/archimate/file_formats/model_exchange_file_reader_30.rb +0 -134
  181. data/lib/archimate/file_formats/model_exchange_file_writer.rb +0 -157
  182. data/lib/archimate/file_formats/writer.rb +0 -56
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Connection < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+ include Sax::CaptureProperties
10
+
11
+ def initialize(name, attrs, parent_handler)
12
+ super
13
+ @bendpoints = []
14
+ @connection_name = nil
15
+ @style = nil
16
+ @connection = nil
17
+ end
18
+
19
+ def complete
20
+ [
21
+ event(:on_connection, connection),
22
+ event(:on_referenceable, connection),
23
+ event(:on_future,
24
+ Sax::FutureReference.new(connection, :source, attrs["source"])),
25
+ event(:on_future,
26
+ Sax::FutureReference.new(connection, :target, attrs["target"])),
27
+ event(:on_future,
28
+ Sax::FutureReference.new(connection,
29
+ :relationship,
30
+ attrs["relationshipRef"] || attrs["relationshipref"]))
31
+ ]
32
+ end
33
+
34
+ def on_location(location, _source)
35
+ @bendpoints << location
36
+ false
37
+ end
38
+
39
+ def on_style(style, _source)
40
+ @style = style
41
+ false
42
+ end
43
+
44
+ def on_lang_string(name, _source)
45
+ @connection_name = name
46
+ false
47
+ end
48
+
49
+ private
50
+
51
+ def connection
52
+ @connection ||= DataModel::Connection.new(id: attrs["identifier"],
53
+ type: attrs["xsi:type"] || attrs["type"],
54
+ source: nil,
55
+ target: nil,
56
+ relationship: nil,
57
+ name: @connection_name,
58
+ style: @style,
59
+ bendpoints: @bendpoints,
60
+ documentation: documentation,
61
+ properties: properties)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Diagram < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+ include Sax::CaptureProperties
10
+
11
+ def initialize(name, attrs, parent_handler)
12
+ super
13
+ @view_nodes = []
14
+ @connections = []
15
+ @diagram_name = nil
16
+ @diagram = nil
17
+ end
18
+
19
+ def complete
20
+ diagram.name = @diagram_name
21
+ diagram.documentation = documentation
22
+ diagram.properties = properties
23
+ diagram.nodes = @view_nodes
24
+ diagram.connections = @connections
25
+ [
26
+ event(:on_diagram, diagram),
27
+ event(:on_referenceable, diagram)
28
+ ]
29
+ end
30
+
31
+ def diagram
32
+ @diagram ||= DataModel::Diagram.new(
33
+ id: @attrs["identifier"],
34
+ viewpoint_type: @attrs["viewpoint"],
35
+ viewpoint: nil,
36
+ connection_router_type: @attrs["connectionRouterType"],
37
+ type: @attrs["xsi:type"],
38
+ background: @attrs["background"]
39
+ )
40
+ end
41
+
42
+ def on_lang_string(name, _source)
43
+ @diagram_name = name
44
+ false
45
+ end
46
+
47
+ def on_view_node(view_node, source)
48
+ @view_nodes << view_node if source.parent_handler == self
49
+ false
50
+ end
51
+
52
+ def on_connection(connection, _source)
53
+ @connections << connection
54
+ false
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Element < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+ include Sax::CaptureProperties
10
+
11
+ def initialize(name, attrs, parent_handler)
12
+ super
13
+ @name = nil
14
+ end
15
+
16
+ def complete
17
+ [
18
+ event(:on_element, element),
19
+ event(:on_referenceable, element)
20
+ ]
21
+ end
22
+
23
+ def on_lang_string(str, _source)
24
+ @name = str
25
+ false
26
+ end
27
+
28
+ private
29
+
30
+ def element
31
+ @element ||= DataModel::Element.new(
32
+ id: attrs["identifier"],
33
+ name: name,
34
+ type: element_type,
35
+ documentation: documentation,
36
+ properties: properties
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Font < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ end
11
+
12
+ def complete
13
+ [
14
+ event(:on_font,
15
+ DataModel::Font.new(
16
+ name: attrs["name"],
17
+ size: attrs["size"],
18
+ style: style_to_int(attrs["style"]),
19
+ font_data: nil
20
+ ))
21
+ ]
22
+ end
23
+
24
+ private
25
+
26
+ def style_to_int(str)
27
+ case str
28
+ when nil
29
+ 0
30
+ when "italic"
31
+ 1
32
+ when "bold"
33
+ 2
34
+ when "bold|italic", "bold italic"
35
+ 3
36
+ else
37
+ raise "Broken for value: #{str}"
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Item < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+
10
+ def initialize(name, attrs, parent_handler)
11
+ super
12
+ @item_name = nil
13
+ @child_items = []
14
+ @child_organizations = []
15
+ @identifier_ref = nil
16
+ @organization = nil
17
+ end
18
+
19
+ def complete
20
+ return [event(:on_item_reference, identifier_ref)] if identifier_ref
21
+
22
+ [
23
+ event(:on_organization, organization),
24
+ event(:on_referenceable, organization),
25
+ event(:on_future, Sax::FutureReference.new(organization, :items, @child_items))
26
+ ]
27
+ end
28
+
29
+ def on_organization(organization, _source)
30
+ @child_organizations << organization
31
+ false
32
+ end
33
+
34
+ def on_item_reference(ref, _source)
35
+ @child_items << ref
36
+ false
37
+ end
38
+
39
+ def on_lang_string(name, _source)
40
+ @item_name = name
41
+ false
42
+ end
43
+
44
+ private
45
+
46
+ def organization
47
+ @organization ||= DataModel::Organization.new(
48
+ id: attrs["identifier"], # TODO: model exchange doesn't assign ids to organization items
49
+ name: @item_name,
50
+ type: attrs["type"],
51
+ documentation: documentation,
52
+ items: nil,
53
+ organizations: @child_organizations
54
+ )
55
+ end
56
+
57
+ def identifier_ref
58
+ @identifier_ref ||= attrs["identifierRef"] || attrs["identifierref"]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Location < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @location = DataModel::Location.new(
11
+ x: @attrs["x"] || 0,
12
+ y: @attrs["y"] || 0
13
+ )
14
+ end
15
+
16
+ def complete
17
+ [event(:on_location, @location)]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Metadata < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @schema_infos = []
11
+ @schema = nil
12
+ @schema_version = nil
13
+ @elements = []
14
+ @metadata = nil
15
+ @lone_schema_info = nil
16
+ end
17
+
18
+ def complete
19
+ [
20
+ event(:on_metadata, metadata)
21
+ ]
22
+ end
23
+
24
+ def on_schema(string, _source)
25
+ @schema = string
26
+ false
27
+ end
28
+
29
+ def on_schemaversion(string, _source)
30
+ @schema_version = string
31
+ false
32
+ end
33
+
34
+ def on_any_element(any_element, _source)
35
+ @elements << any_element
36
+ false
37
+ end
38
+
39
+ def on_schema_info(schema_info, _source)
40
+ @schema_infos << schema_info
41
+ false
42
+ end
43
+
44
+ private
45
+
46
+ def metadata
47
+ return @metadata if @metadata
48
+ @schema_infos << lone_schema_info if @schema
49
+ @metadata = DataModel::Metadata.new(
50
+ schema_infos: @schema_infos
51
+ )
52
+ end
53
+
54
+ def lone_schema_info
55
+ return nil unless @schema
56
+ @lone_schema_info = DataModel::SchemaInfo.new(
57
+ schema: @schema,
58
+ schemaversion: @schema_version,
59
+ elements: @elements
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module ModelExchangeFile
7
+ class Model < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+ include Sax::CaptureProperties
10
+
11
+ attr_reader :property_definitions
12
+
13
+ def initialize(name, attrs, parent_handler)
14
+ super
15
+ @property_definitions = {}
16
+ @elements = []
17
+ @organizations = []
18
+ @relationships = []
19
+ @diagrams = []
20
+ @viewpoints = []
21
+ @futures = []
22
+ @metadata = nil
23
+ @index = {}
24
+ @model = nil
25
+ end
26
+
27
+ def complete
28
+ process_futures
29
+ [event(:on_model, model)]
30
+ end
31
+
32
+ def on_element(element, _source)
33
+ @elements << element
34
+ false
35
+ end
36
+
37
+ def on_organization(organization, _source)
38
+ @organizations << organization
39
+ false
40
+ end
41
+
42
+ def on_relationship(relationship, _source)
43
+ @relationships << relationship
44
+ false
45
+ end
46
+
47
+ def on_diagram(diagram, _source)
48
+ @diagrams << diagram
49
+ false
50
+ end
51
+
52
+ def on_viewpoint(viewpoint, _source)
53
+ @viewpoints << viewpoint
54
+ false
55
+ end
56
+
57
+ def on_metadata(metadata, _source)
58
+ @metadata = metadata
59
+ false
60
+ end
61
+
62
+ def on_property_definition(property_definition, _source)
63
+ @property_definitions[property_definition.id] = property_definition
64
+ false
65
+ end
66
+
67
+ def on_future(future, _source)
68
+ @futures << future
69
+ end
70
+
71
+ def on_referenceable(referenceable, _source)
72
+ return unless referenceable.id
73
+ @index[referenceable.id] = referenceable
74
+ end
75
+
76
+ def on_any_element(any_element, _source)
77
+ raise "Unexpected: #{any_element.inspect}"
78
+ end
79
+
80
+ def on_lang_string(lang_string, _source)
81
+ @name = lang_string
82
+ false
83
+ end
84
+
85
+ private
86
+
87
+ def process_futures
88
+ @futures.each do |future|
89
+ next unless future.id
90
+ future.obj.send(
91
+ "#{future.attr}=".to_sym,
92
+ if future.id.is_a?(Array)
93
+ future.id.map do |id|
94
+ raise "Error processing futures for array. id was nil" unless id
95
+ @index[id]
96
+ end
97
+ else
98
+ future.id ? @index[future.id] : nil
99
+ end
100
+ )
101
+ end
102
+ end
103
+
104
+ def model
105
+ @model ||= DataModel::Model.new(id: attrs["identifier"],
106
+ name: name,
107
+ metadata: @metadata,
108
+ documentation: documentation,
109
+ properties: properties,
110
+ elements: @elements,
111
+ organizations: @organizations,
112
+ relationships: @relationships,
113
+ diagrams: @diagrams,
114
+ viewpoints: @viewpoints,
115
+ property_definitions: @property_definitions.values,
116
+ schema_locations: attrs["xsi:schemaLocation"].split(" "),
117
+ namespaces: attrs.select { |k, _v| k.start_with?("xmlns") },
118
+ version: @attrs["version"])
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end