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,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Bounds < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @bounds = DataModel::Bounds.new(
11
+ x: @attrs["x"],
12
+ y: @attrs["y"],
13
+ width: @attrs["width"],
14
+ height: @attrs["height"]
15
+ )
16
+ end
17
+
18
+ def complete
19
+ [event(:on_bounds, @bounds)]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Connection < FileFormats::Sax::Handler
8
+ include Style
9
+ include Sax::CaptureDocumentation
10
+ include Sax::CaptureProperties
11
+
12
+ def initialize(name, attrs, parent_handler)
13
+ super
14
+ @bendpoints = []
15
+ end
16
+
17
+ def complete
18
+ connection = DataModel::Connection.new(
19
+ id: @attrs["id"],
20
+ type: @attrs["xsi:type"],
21
+ source: nil,
22
+ target: nil,
23
+ relationship: nil,
24
+ name: @attrs["name"],
25
+ style: style,
26
+ bendpoints: @bendpoints,
27
+ documentation: documentation,
28
+ properties: properties
29
+ )
30
+ [
31
+ event(:on_connection, connection),
32
+ event(:on_referenceable, connection),
33
+ event(:on_future, Sax::FutureReference.new(connection, :source, @attrs["source"])),
34
+ event(:on_future, Sax::FutureReference.new(connection, :target, @attrs["target"])),
35
+ event(:on_future, Sax::FutureReference.new(connection, :relationship, @attrs["relationship"]))
36
+ ]
37
+ end
38
+
39
+ def on_location(location, _source)
40
+ @bendpoints << location
41
+ false
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Content < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @characters = []
11
+ end
12
+
13
+ def characters(string)
14
+ @characters << string
15
+ end
16
+
17
+ def complete
18
+ content = @characters.join("").strip
19
+ return [] if content.empty?
20
+ [
21
+ event(:on_content, content)
22
+ ]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ require "scanf"
3
+
4
+ module Archimate
5
+ module FileFormats
6
+ module Sax
7
+ module Archi
8
+ class Diagram < FileFormats::Sax::Handler
9
+ include Sax::CaptureDocumentation
10
+ include Sax::CaptureProperties
11
+
12
+ def initialize(name, attrs, parent_handler)
13
+ super
14
+ @view_nodes = []
15
+ @connections = []
16
+ @diagram = nil
17
+ end
18
+
19
+ def complete
20
+ diagram.documentation = documentation
21
+ diagram.properties = properties
22
+ diagram.nodes = @view_nodes
23
+ diagram.connections = @connections
24
+ [
25
+ event(:on_diagram, diagram),
26
+ event(:on_referenceable, diagram)
27
+ ]
28
+ end
29
+
30
+ def diagram
31
+ @diagram ||= DataModel::Diagram.new(
32
+ id: @attrs["id"],
33
+ name: DataModel::LangString.string(process_text(@attrs["name"])),
34
+ viewpoint_type: parse_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_view_node(view_node, source)
43
+ @view_nodes << view_node if source.parent_handler == self
44
+ false
45
+ end
46
+
47
+ def on_connection(connection, _source)
48
+ @connections << connection
49
+ false
50
+ end
51
+
52
+ def parse_viewpoint_type(viewpoint_idx)
53
+ case viewpoint_idx
54
+ when String
55
+ idx = viewpoint_idx.scanf("%d").first
56
+ return nil unless idx
57
+ Serializer::Archi::ViewpointType.values[idx]
58
+ else
59
+ nil
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
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
+ @element = nil
14
+ end
15
+
16
+ def complete
17
+ [
18
+ event(:on_element, element),
19
+ event(:on_referenceable, element)
20
+ ]
21
+ end
22
+
23
+ private
24
+
25
+ def element
26
+ @element ||= DataModel::Element.new(id: @attrs["id"],
27
+ name: DataModel::LangString.string(process_text(@attrs["name"])),
28
+ type: element_type,
29
+ documentation: documentation,
30
+ properties: properties)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Location < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @location = DataModel::Location.new(
11
+ x: @attrs["startX"] || 0,
12
+ y: @attrs["startY"] || 0,
13
+ end_x: @attrs["endX"],
14
+ end_y: @attrs["endY"]
15
+ )
16
+ end
17
+
18
+ def complete
19
+ [event(:on_location, @location)]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
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
+ @index = {}
23
+ @model = nil
24
+ end
25
+
26
+ def complete
27
+ process_futures
28
+ [event(:on_model, model)]
29
+ end
30
+
31
+ def on_element(element, _source)
32
+ @elements << element
33
+ false
34
+ end
35
+
36
+ def on_organization(organization, _source)
37
+ @organizations << organization
38
+ false
39
+ end
40
+
41
+ def on_relationship(relationship, _source)
42
+ @relationships << relationship
43
+ false
44
+ end
45
+
46
+ def on_diagram(diagram, _source)
47
+ @diagrams << diagram
48
+ false
49
+ end
50
+
51
+ def on_viewpoint(viewpoint, _source)
52
+ @viewpoints << viewpoint
53
+ false
54
+ end
55
+
56
+ def on_property_definition(property_definition, _source)
57
+ @property_definitions[property_definition.id] = property_definition
58
+ false
59
+ end
60
+
61
+ def on_future(future, _source)
62
+ @futures << future
63
+ end
64
+
65
+ def on_referenceable(referenceable, _source)
66
+ @index[referenceable.id] = referenceable
67
+ end
68
+
69
+ private
70
+
71
+ def process_futures
72
+ @futures.each do |future|
73
+ future.obj.send(
74
+ "#{future.attr}=".to_sym,
75
+ if future.id.is_a?(Array)
76
+ future.id.map { |id| @index[id] }
77
+ else
78
+ @index[future.id]
79
+ end
80
+ )
81
+ end
82
+ end
83
+
84
+ # def process_futures_using_fibers
85
+ # @futures.each do |future|
86
+ # future.resume(@index)
87
+ # end
88
+ # end
89
+
90
+ def model
91
+ @model ||= DataModel::Model.new(id: @attrs["id"],
92
+ name: DataModel::LangString.string(process_text(@attrs["name"])),
93
+ documentation: documentation,
94
+ properties: properties,
95
+ elements: @elements,
96
+ organizations: @organizations,
97
+ relationships: @relationships,
98
+ diagrams: @diagrams,
99
+ viewpoints: @viewpoints,
100
+ property_definitions: @property_definitions.values,
101
+ namespaces: {},
102
+ schema_locations: [],
103
+ version: @attrs["version"])
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Organization < FileFormats::Sax::Handler
8
+ include Sax::CaptureDocumentation
9
+
10
+ def initialize(name, attrs, parent_handler)
11
+ super
12
+ @child_items = []
13
+ @child_organizations = []
14
+ @organization = nil
15
+ end
16
+
17
+ def complete
18
+ [
19
+ event(:on_organization, organization),
20
+ event(:on_referenceable, organization)
21
+ ]
22
+ end
23
+
24
+ def on_diagram(diagram, source)
25
+ @child_items << diagram if source.parent_handler == self
26
+ diagram
27
+ end
28
+
29
+ def on_element(element, source)
30
+ @child_items << element if source.parent_handler == self
31
+ element
32
+ end
33
+
34
+ def on_organization(organization, _source)
35
+ @child_organizations << organization
36
+ false
37
+ end
38
+
39
+ def on_relationship(relationship, source)
40
+ @child_items << relationship if source.parent_handler == self
41
+ relationship
42
+ end
43
+
44
+ private
45
+
46
+ def organization
47
+ @organization ||= DataModel::Organization.new(id: @attrs["id"],
48
+ name: DataModel::LangString.string(
49
+ process_text(@attrs["name"])
50
+ ),
51
+ type: @attrs["type"],
52
+ documentation: documentation,
53
+ items: @child_items,
54
+ organizations: @child_organizations)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archimate
4
+ module FileFormats
5
+ module Sax
6
+ module Archi
7
+ class Property < FileFormats::Sax::Handler
8
+ def initialize(name, attrs, parent_handler)
9
+ super
10
+ @property = nil
11
+ @property_def = nil
12
+ @key = nil
13
+ @events = []
14
+ end
15
+
16
+ def complete
17
+ return [] unless key
18
+ @events << event(
19
+ :on_property,
20
+ DataModel::Property.new(
21
+ value: DataModel::LangString.string(process_text(attrs["value"])),
22
+ property_definition: prop_def
23
+ )
24
+ )
25
+ end
26
+
27
+ private
28
+
29
+ def key
30
+ @key ||= attrs["key"]
31
+ end
32
+
33
+ def prop_def
34
+ return property_definitions[key] if property_definitions.key?(key)
35
+
36
+ prop_def = make_prop_def
37
+ @events << event(:on_property_definition, prop_def)
38
+ @events << event(:on_referenceable, prop_def)
39
+ prop_def
40
+ end
41
+
42
+ def make_prop_def
43
+ DataModel::PropertyDefinition.new(
44
+ id: DataModel::PropertyDefinition.identifier_for_key(key),
45
+ name: DataModel::LangString.string(process_text(key)),
46
+ documentation: nil,
47
+ type: "string"
48
+ )
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end