Class: Archimate::FileFormats::ModelExchangeFileWriter21

Inherits:
ModelExchangeFileWriter show all
Defined in:
lib/archimate/file_formats/model_exchange_file_writer_21.rb

Overview

Archimate version 2.1 Model Exchange Format Writer

Instance Attribute Summary

Attributes inherited from ModelExchangeFileWriter

#model

Attributes inherited from Writer

#model

Instance Method Summary collapse

Methods inherited from ModelExchangeFileWriter

#elementbase, #identifier, #model_namespaces, #relationship_attributes, #serialize_color, #serialize_element, #serialize_elements, #serialize_font, #serialize_location, #serialize_organization, #serialize_organization_body, #serialize_properties, #serialize_relationship, #serialize_relationships, #serialize_style, #text_proc, #write

Methods inherited from Writer

#remove_nil_values, #serialize, write

Constructor Details

#initialize(model) ⇒ ModelExchangeFileWriter21

Returns a new instance of ModelExchangeFileWriter21.



8
9
10
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 8

def initialize(model)
  super
end

Instance Method Details

#font_style_string(font) ⇒ Object



116
117
118
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 116

def font_style_string(font)
  font&.style_string
end

#meff_type(el_type) ⇒ Object



132
133
134
135
136
137
138
139
140
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 132

def meff_type(el_type)
  el_type = el_type.sub(/^/, "")
  case el_type
  when 'AndJunction', 'OrJunction'
    'Junction'
  else
    el_type
  end
end

#model_attrsObject



12
13
14
15
16
17
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 12

def model_attrs
  model_namespaces.merge(
    "xsi:schemaLocation" => model.schema_locations.join(" "),
    "identifier" => identifier(model.id)
  )
end

#serialize_connection(xml, sc) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 120

def serialize_connection(xml, sc)
  xml.connection(
    identifier: identifier(sc.id),
    relationshipref: identifier(sc.relationship),
    source: identifier(sc.source),
    target: identifier(sc.target)
  ) do
    serialize(xml, sc.bendpoints)
    serialize(xml, sc.style)
  end
end

#serialize_diagram(xml, diagram) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 68

def serialize_diagram(xml, diagram)
  xml.view(
    remove_nil_values(
      identifier: identifier(diagram.id),
      viewpoint: diagram.viewpoint_type,
      "xsi:type": diagram.type
    )
  ) do
    elementbase(xml, diagram)
    serialize(xml, diagram.nodes)
    serialize(xml, diagram.connections)
  end
end

#serialize_item(xml, item) ⇒ Object



51
52
53
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 51

def serialize_item(xml, item)
  xml.item(identifierref: identifier(item))
end

#serialize_label(xml, str) ⇒ Object



38
39
40
41
42
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 38

def serialize_label(xml, str)
  return if str.nil? || str.strip.empty?
  name_attrs = str.lang && !str.lang.empty? ? {"xml:lang" => str.lang} : {}
  xml.label(name_attrs) { xml.text text_proc(str) }
end

#serialize_model(xml) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 19

def serialize_model(xml)
  xml.model(model_attrs) do
    ModelExchangeFile::XmlMetadata.new(model.).serialize(xml)
    ModelExchangeFile::XmlLangString.new(model.name, :name).serialize(xml)
    ModelExchangeFile::XmlLangString.new(model.documentation, :documentation).serialize(xml)
    serialize_properties(xml, model)
    serialize_elements(xml)
    serialize_relationships(xml)
    serialize_organization_root(xml, model.organizations)
    serialize_property_defs(xml)
    serialize_views(xml)
  end
end

#serialize_organization_root(xml, organizations) ⇒ Object



44
45
46
47
48
49
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 44

def serialize_organization_root(xml, organizations)
  return unless organizations && organizations.size > 0
  xml.organization do
    serialize(xml, organizations)
  end
end

#serialize_property(xml, property) ⇒ Object



55
56
57
58
59
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 55

def serialize_property(xml, property)
  xml.property(identifierref: property.property_definition.id) do
    ModelExchangeFile::XmlLangString.new(property.value, :value).serialize(xml)
  end
end

#serialize_property_defs(xml) ⇒ Object



33
34
35
36
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 33

def serialize_property_defs(xml)
  return if model.property_definitions.empty?
  ModelExchangeFile::XmlPropertyDefs.new(model.property_definitions).serialize(xml)
end

#serialize_view_node(xml, view_node, x_offset = 0, y_offset = 0) ⇒ Object



105
106
107
108
109
110
111
112
113
114
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 105

def serialize_view_node(xml, view_node, x_offset = 0, y_offset = 0)
  attrs = view_node_attrs(view_node, x_offset, y_offset)
  xml.node(attrs) do
    serialize_label(xml, view_node.name) if attrs[:type] == "group"
    serialize(xml, view_node.style) if view_node.style
    view_node.nodes.each do |c|
      serialize_view_node(xml, c) # , attrs[:x].to_f, attrs[:y].to_f)
    end
  end
end

#serialize_views(xml) ⇒ Object



61
62
63
64
65
66
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 61

def serialize_views(xml)
  return if model.diagrams.empty?
  xml.views do
    serialize(xml, model.diagrams)
  end
end

#view_node_attrs(view_node, x_offset = 0, y_offset = 0) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/archimate/file_formats/model_exchange_file_writer_21.rb', line 82

def view_node_attrs(view_node, x_offset = 0, y_offset = 0)
  attrs = {
    identifier: identifier(view_node.id),
    elementref: nil,
    x: view_node.bounds ? (view_node.bounds&.x + x_offset).round : nil,
    y: view_node.bounds ? (view_node.bounds&.y + y_offset).round : nil,
    w: view_node.bounds&.width&.round,
    h: view_node.bounds&.height&.round,
    type: nil
  }
  if view_node.archimate_element
    attrs[:elementref] = identifier(view_node.archimate_element)
  elsif view_node.model
    # Since it doesn't seem to be forbidden, we just assume we can use
    # the elementref for views in views
    attrs[:elementref] = view_node.model
    attrs[:type] = "model"
  else
    attrs[:type] = "group"
  end
  remove_nil_values(attrs)
end