archimate 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Archimate
4
- module FileFormats
5
- module ModelExchangeFile
6
- class XmlLangString
7
- def self.parse(node)
8
- return nil unless node
9
- DataModel::LangString.new(text: node.content, lang: node["xml:lang"])
10
- end
11
-
12
- def initialize(lang_str, tag_name)
13
- @tag_name = tag_name
14
- @lang_strs = Array(lang_str)
15
- end
16
-
17
- def serialize(xml)
18
- return if @lang_strs.empty?
19
-
20
- @lang_strs.each do |lang_str|
21
- attrs = lang_str.lang && !lang_str.lang.empty? ? {"xml:lang" => lang_str.lang} : {}
22
- xml.send(@tag_name, attrs) { xml.text text_proc(lang_str) }
23
- end
24
- end
25
-
26
- # Processes text for text elements
27
- private
28
-
29
- def text_proc(str)
30
- str.strip.tr("\r", "\n")
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Archimate
4
- module FileFormats
5
- module ModelExchangeFile
6
- class XmlMetadata
7
- def self.parse(metadata)
8
- return nil unless metadata
9
- DataModel::Metadata.new(schema_infos: parse_schema_infos(metadata))
10
- end
11
-
12
- def initialize(metadata)
13
- @metadata = metadata
14
- end
15
-
16
- def serialize(xml)
17
- return unless @metadata && @metadata.schema_infos.size > 0
18
- xml.metadata do
19
- if @metadata.schema_infos.size == 1
20
- serialize_schema_info_body(xml, @metadata.schema_infos.first)
21
- else
22
- @metadata.schema_infos.each do |schema_info|
23
- serialize_schema_info(xml, schema_info)
24
- end
25
- end
26
- end
27
- end
28
-
29
- private
30
-
31
- def serialize_schema_info(xml, schema_info)
32
- xml.schemaInfo do
33
- serialize_schema_info_body(xml, schema_info)
34
- end
35
- end
36
-
37
- def serialize_schema_info_body(xml, schema_info)
38
- xml.schema { xml.text (schema_info.schema) } if schema_info.schema
39
- xml.schemaversion { xml.text (schema_info.schemaversion) } if schema_info.schemaversion
40
- schema_info.elements.each do |el|
41
- serialize_any_element(xml, el)
42
- end
43
- end
44
-
45
- def serialize_any_element(xml, el)
46
- if el.prefix && !el.prefix.empty?
47
- xml_prefix = xml[el.prefix]
48
- else
49
- xml_prefix = xml
50
- end
51
- xml_prefix.send(el.element.to_sym, serialize_any_attributes(el.attributes)) do
52
- xml.text(el.content) if el.content&.size > 0
53
- el.children.each { |child| serialize_any_element(xml, child) }
54
- end
55
- end
56
-
57
- def serialize_any_attributes(attrs)
58
- attrs.each_with_object({}) do |attr, hash|
59
- key = attr.prefix&.size > 0 ? [attr.prefix, attr.attribute].join(":") : attr.attribute
60
- hash[key] = attr.value
61
- end
62
- end
63
-
64
- def self.parse_schema_infos(metadata)
65
- schema_infos = metadata.css(">schemaInfo")
66
- if schema_infos.size > 0
67
- schema_infos.map { |si| parse_schema_info(si) }
68
- else
69
- [parse_schema_info(metadata)].compact
70
- end
71
- end
72
-
73
- def self.parse_schema_info(node)
74
- els = node.element_children
75
- return nil if els.empty?
76
- schema_info_attrs = {
77
- schema: nil,
78
- schemaversion: nil,
79
- elements: []
80
- }
81
- els.each do |el|
82
- case(el.name)
83
- when "schema"
84
- schema_info_attrs[:schema] = el.text
85
- when "schemaversion"
86
- schema_info_attrs[:schemaversion] = el.text
87
- else
88
- schema_info_attrs[:elements] << parse_any_element(el)
89
- end
90
- end
91
- DataModel::SchemaInfo.new(schema_info_attrs)
92
- end
93
-
94
- def self.parse_any_element(node)
95
- return nil unless node && node.is_a?(Nokogiri::XML::Element)
96
- DataModel::AnyElement.new(
97
- element: node.name,
98
- prefix: node.namespace&.prefix,
99
- attributes: node.attributes.map { |attr| parse_any_attribute(attr) },
100
- content: node.text,
101
- children: node.element_children.map { |child| parse_any_element(node) }
102
- )
103
- end
104
-
105
- def self.parse_any_attribute(attr)
106
- DataModel::AnyAttribute.new(
107
- attribute: attr.name,
108
- prefix: attr.namepace&.prefix,
109
- value: attr.text
110
- )
111
- end
112
- end
113
- end
114
- end
115
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Archimate
4
- module FileFormats
5
- module ModelExchangeFile
6
- # Property Definitions as defined in ArchiMate 3.0 Model Exchange XSDs
7
- class XmlPropertyDefinitions
8
- def initialize(property_defs)
9
- @property_definitions = property_defs
10
- end
11
-
12
- def serialize(xml)
13
- return if @property_definitions.empty?
14
- xml.propertyDefinitions do
15
- @property_definitions.each do |property_def|
16
- xml.propertyDefinition(
17
- "identifier" => property_def.id,
18
- "type" => property_def.value_type
19
- ) do
20
- ModelExchangeFile::XmlLangString.new(property_def.name, :name).serialize(xml)
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
- require "nokogiri"
3
-
4
- module Archimate
5
- module FileFormats
6
- # This class implements a file reader for ArchiMate 2.1 Model Exchange Format
7
- class ModelExchangeFileReader21 < ModelExchangeFileReader
8
- def parse_archimate_version(root)
9
- case root.namespace.href
10
- when "http://www.opengroup.org/xsd/archimate"
11
- :archimate_2_1
12
- else
13
- raise "Unexpected namespace: #{root.namespace.href}"
14
- end
15
- end
16
-
17
- def organizations_root_selector
18
- ">organization>item"
19
- end
20
-
21
- def property_defs_selector
22
- ">propertydefs>propertydef"
23
- end
24
-
25
- def property_def_attr_name
26
- "identifierref"
27
- end
28
-
29
- def property_def_name(node)
30
- node["name"]
31
- end
32
-
33
- def parse_element_name(el)
34
- ModelExchangeFile::XmlLangString.parse(el.at_css(">label"))
35
- end
36
-
37
- def identifier_ref_name
38
- "identifierref"
39
- end
40
-
41
- def diagrams_path
42
- ">views>view"
43
- end
44
-
45
- def view_node_element_ref
46
- "elementref"
47
- end
48
-
49
- def view_node_type_attr
50
- "type"
51
- end
52
-
53
- def connection_relationship_ref
54
- "relationshipref"
55
- end
56
-
57
- def style_to_int(str)
58
- case str
59
- when nil
60
- 0
61
- when "italic"
62
- 1
63
- when "bold"
64
- 2
65
- when "bold|italic"
66
- 3
67
- else
68
- raise "Broken for value: #{str}"
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,134 +0,0 @@
1
- # frozen_string_literal: true
2
- require "nokogiri"
3
-
4
- module Archimate
5
- module FileFormats
6
- class ModelExchangeFileReader30 < ModelExchangeFileReader
7
- def parse_archimate_version(root)
8
- case root.namespace.href
9
- when "http://www.opengroup.org/xsd/archimate/3.0/"
10
- :archimate_3_0
11
- else
12
- raise "Unexpected namespace version: #{root.namespace.href}"
13
- end
14
- end
15
-
16
- def organizations_root_selector
17
- ">organizations"
18
- end
19
-
20
- def property_defs_selector
21
- ">propertyDefinitions>propertyDefinition"
22
- end
23
-
24
- def property_def_attr_name
25
- "propertyDefinitionRef"
26
- end
27
-
28
- def property_def_name(node)
29
- ModelExchangeFile::XmlLangString.parse(node.at_css("name"))
30
- end
31
-
32
- def parse_element_name(el)
33
- ModelExchangeFile::XmlLangString.parse(el.at_css(">name"))
34
- end
35
-
36
- def identifier_ref_name
37
- "identifierRef"
38
- end
39
-
40
- def diagrams_path
41
- ">views>diagrams>view"
42
- end
43
-
44
- def view_node_element_ref
45
- "elementRef"
46
- end
47
-
48
- def view_node_type_attr
49
- "xsi:type"
50
- end
51
-
52
- def connection_relationship_ref
53
- "relationshipRef"
54
- end
55
-
56
- def style_to_int(str)
57
- case str
58
- when nil
59
- 0
60
- when "italic"
61
- 1
62
- when "bold"
63
- 2
64
- when "bold italic"
65
- 3
66
- else
67
- raise "Broken for value: #{str}"
68
- end
69
- end
70
-
71
- # <xs:simpleType name="ViewpointPurposeEnum">
72
- # <xs:restriction base="xs:NMTOKEN">
73
- # <xs:enumeration value="Designing" />
74
- # <xs:enumeration value="Deciding" />
75
- # <xs:enumeration value="Informing" />
76
- # </xs:restriction>
77
- # </xs:simpleType>
78
-
79
- # <xs:simpleType name="ViewpointPurposeType">
80
- # <xs:list itemType="ViewpointPurposeEnum" />
81
- # </xs:simpleType>
82
-
83
- # <xs:simpleType name="ViewpointContentEnum">
84
- # <xs:restriction base="xs:NMTOKEN">
85
- # <xs:enumeration value="Details" />
86
- # <xs:enumeration value="Coherence" />
87
- # <xs:enumeration value="Overview" />
88
- # </xs:restriction>
89
- # </xs:simpleType>
90
-
91
- # <xs:simpleType name="ViewpointContentType">
92
- # <xs:list itemType="ViewpointContentEnum" />
93
- # </xs:simpleType>
94
-
95
- # <xs:complexType name="ViewpointType">
96
- # <xs:complexContent>
97
- # <xs:extension base="NamedReferenceableType">
98
- # <xs:sequence>
99
- # <xs:group ref="PropertiesGroup" />
100
- # <xs:element name="concern" type="ConcernType" minOccurs="0" maxOccurs="unbounded" />
101
- # <xs:element name="viewpointPurpose" type="ViewpointPurposeType" minOccurs="0" maxOccurs="1" />
102
- # <xs:element name="viewpointContent" type="ViewpointContentType" minOccurs="0" maxOccurs="1" />
103
- # <xs:element name="allowedElementType" type="AllowedElementTypeType" minOccurs="0" maxOccurs="unbounded" />
104
- # <xs:element name="allowedRelationshipType" type="AllowedRelationshipTypeType" minOccurs="0" maxOccurs="unbounded" />
105
- # <xs:element name="modelingNote" type="ModelingNoteType" minOccurs="0" maxOccurs="unbounded" />
106
- # </xs:sequence>
107
- # </xs:extension>
108
- # </xs:complexContent>
109
- # </xs:complexType>
110
- def parse_viewpoints(model)
111
- []
112
- # model.css("views > viewpoints").map do |i|
113
- # attribute :concern, ConcernList
114
- # attribute :viewpointPurpose, ViewpointPurpose.optional
115
- # attribute :viewpointContent, ViewpointContent.optional
116
- # attribute :allowedElementTypes, AllowedElementTypes
117
- # attribute :allowedRelationshipTypes, AllowedRelationshipTypes
118
- # attribute :modelingNotes, Strict::Array.member(ModelingNote).default([])
119
- # DataModel::Viewpoint.new(
120
- # id: identifier_to_id(i["identifier"]),
121
- # name: parse_element_name(i),
122
- # documentation: parse_documentation(i),
123
- # properties: parse_properties(i),
124
- # nodes: nodes,
125
- # connections: connections,
126
- # connection_router_type: i["connectionRouterType"],
127
- # type: i.attr("xsi:type"),
128
- # background: i.attr("background")
129
- # )
130
- # end
131
- end
132
- end
133
- end
134
- end
@@ -1,157 +0,0 @@
1
- # frozen_string_literal: true
2
- require "nokogiri"
3
-
4
- module Archimate
5
- module FileFormats
6
- class ModelExchangeFileWriter < Writer
7
- attr_reader :model
8
-
9
- def initialize(model)
10
- super
11
- end
12
-
13
- def write(output_io)
14
- builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
15
- serialize_model(xml)
16
- end
17
- output_io.write(builder.to_xml)
18
- end
19
-
20
- def serialize_elements(xml)
21
- xml.elements { serialize(xml, model.elements) } unless model.elements.empty?
22
- end
23
-
24
- def serialize_element(xml, element)
25
- return if element.type == "SketchModel" # TODO: print a warning that data is lost
26
- xml.element(identifier: identifier(element['id']),
27
- "xsi:type" => meff_type(element.type)) do
28
- elementbase(xml, element)
29
- end
30
- end
31
-
32
- def elementbase(xml, element)
33
- serialize_label(xml, element.name)
34
- serialize(xml, element.documentation)
35
- serialize_properties(xml, element)
36
- end
37
-
38
- def serialize_label(xml, str)
39
- return if str.nil? || str.strip.empty?
40
- name_attrs = str.lang && !str.lang.empty? ? {"xml:lang" => str.lang} : {}
41
- xml.label(name_attrs) { xml.text text_proc(str) }
42
- end
43
-
44
- def serialize_relationships(xml)
45
- return if model.relationships.empty?
46
- xml.relationships { serialize(xml, model.relationships) }
47
- end
48
-
49
- def relationship_attributes(relationship)
50
- {
51
- identifier: identifier(relationship.id),
52
- source: identifier(relationship.source),
53
- target: identifier(relationship.target),
54
- "xsi:type" => meff_type(relationship.type)
55
- }
56
- end
57
-
58
- def serialize_relationship(xml, relationship)
59
- xml.relationship(
60
- relationship_attributes(relationship)
61
- ) do
62
- elementbase(xml, relationship)
63
- end
64
- end
65
-
66
- def serialize_organization_root(xml, organizations)
67
- return unless organizations && organizations.size > 0
68
- xml.organization do
69
- serialize(xml, organizations)
70
- end
71
- end
72
-
73
- def serialize_organization(xml, organization)
74
- return if organization.items.empty? && organization.documentation.empty? && organization.organizations.empty?
75
- item_attrs = organization.id.nil? || organization.id.empty? ? {} : {identifier: organization.id}
76
- xml.item(item_attrs) do
77
- serialize_organization_body(xml, organization)
78
- end
79
- end
80
-
81
- def serialize_organization_body(xml, organization)
82
- return if organization.items.empty? && organization.documentation.empty? && organization.organizations.empty?
83
- str = organization.name
84
- label_attrs = organization.name&.lang && !organization.name.lang.empty? ? {"xml:lang" => organization.name.lang} : {}
85
- xml.label(label_attrs) { xml.text text_proc(str) } unless str.nil? || str.strip.empty?
86
- serialize(xml, organization.documentation)
87
- serialize(xml, organization.organizations)
88
- organization.items.each { |i| serialize_item(xml, i) }
89
- end
90
-
91
- def serialize_properties(xml, element)
92
- return if element.properties.empty?
93
- xml.properties do
94
- serialize(xml, element.properties)
95
- end
96
- end
97
-
98
- def serialize_style(xml, style)
99
- return unless style
100
- xml.style(
101
- remove_nil_values(
102
- lineWidth: style.line_width
103
- )
104
- ) do
105
- serialize_color(xml, style.fill_color, :fillColor)
106
- serialize_color(xml, style.line_color, :lineColor)
107
- serialize_font(xml, style)
108
- # TODO: complete this
109
- end
110
- end
111
-
112
- def serialize_font(xml, style)
113
- return unless style && (style.font || style.font_color)
114
- xml.font(
115
- remove_nil_values(
116
- name: style.font&.name,
117
- size: style.font&.size&.round,
118
- style: font_style_string(style.font)
119
- )
120
- ) { serialize_color(xml, style&.font_color, :color) }
121
- end
122
-
123
- def serialize_color(xml, color, sym)
124
- return if color.nil?
125
- h = {
126
- r: color.r,
127
- g: color.g,
128
- b: color.b,
129
- a: color.a
130
- }
131
- h.delete(:a) if color.a.nil? || color.a == 100
132
- xml.send(sym, h)
133
- end
134
-
135
- def serialize_location(xml, location)
136
- xml.bendpoint(x: location.x.round, y: location.y.round)
137
- end
138
-
139
- # # Processes text for text elements
140
- def text_proc(str)
141
- str.strip.tr("\r", "\n")
142
- end
143
-
144
- # TODO: this should replace namespaces as appropriate for the desired export version
145
- def model_namespaces
146
- model.namespaces
147
- end
148
-
149
- # TODO: Archi uses hex numbers for ids which may not be valid for
150
- # identifer. If we are converting from Archi, decorate the IDs here.
151
- def identifier(str)
152
- return "id-#{str}" if str =~ /^\d/
153
- str
154
- end
155
- end
156
- end
157
- end