lib/lutaml/xmi/parsers/xml.rb in lutaml-xmi-0.2.0 vs lib/lutaml/xmi/parsers/xml.rb in lutaml-xmi-0.2.1
- old
+ new
@@ -125,21 +125,25 @@
end
def serialize_model_associations(klass)
xmi_id = klass["xmi:id"]
main_model.xpath(%(//element[@xmi:idref="#{xmi_id}"]/links/*)).map do |link|
- member_end, member_end_type, member_end_cardinality, member_end_attribute_name = serialize_member_type(xmi_id, link)
- owned_end_cardinality, owned_end_attribute_name = serialize_owned_type(xmi_id, link)
+ link_member_name = link.attributes["start"].value == xmi_id ? "end" : "start"
+ linke_owner_name = link_member_name == "start" ? "end" : "start"
+ member_end, member_end_type, member_end_cardinality, member_end_attribute_name = serialize_member_type(xmi_id, link, link_member_name)
+ owner_end, owner_end_cardinality, owner_end_attribute_name = serialize_owned_type(xmi_id, link, linke_owner_name)
if member_end && ((member_end_type != 'aggregation') || (member_end_type == 'aggregation' && member_end_attribute_name))
- definition_node = main_model.xpath(%(//connector[@xmi:idref="#{link['xmi:id']}"]/target/documentation)).first
+ doc_node_name = link_member_name == "start" ? "source" : "target"
+ definition_node = main_model.xpath(%(//connector[@xmi:idref="#{link['xmi:id']}"]/#{doc_node_name}/documentation)).first
definition = definition_node.attributes['value']&.value if definition_node
{
xmi_id: link["xmi:id"],
member_end: member_end,
member_end_type: member_end_type,
member_end_cardinality: member_end_cardinality,
member_end_attribute_name: member_end_attribute_name,
+ owner_end: owner_end,
definition: definition
}
end
end
end
@@ -165,15 +169,16 @@
body: constraint["name"],
}
end
end
- def serialize_owned_type(owned_xmi_id, link)
+ def serialize_owned_type(owner_xmi_id, link, linke_owner_name)
return if link.name == 'NoteLink'
- return generalization_association(owned_xmi_id, link) if link.name == "Generalization"
+ return generalization_association(owner_xmi_id, link) if link.name == "Generalization"
- xmi_id = link.attributes["start"].value
+ xmi_id = link.attributes[linke_owner_name].value
+ owner_end = lookup_entity_name(xmi_id) || connector_source_name(xmi_id)
if link.name == "Association"
assoc_connector = main_model.xpath(%(//connector[@xmi:idref="#{link['xmi:id']}"]/source)).first
if assoc_connector
connector_type = assoc_connector.children.find { |node| node.name == 'type' }
@@ -195,22 +200,23 @@
owned_cardinality = { "min" => cardinality_min_value(assoc), "max" => cardinality_max_value(assoc) }
owned_attribute_name = assoc.attributes["name"]&.value
end
end
- [owned_cardinality, owned_attribute_name]
+ [owner_end, owned_cardinality, owned_attribute_name]
end
- def serialize_member_type(owned_xmi_id, link)
+ def serialize_member_type(owner_xmi_id, link, link_member_name)
return if link.name == 'NoteLink'
- return generalization_association(owned_xmi_id, link) if link.name == "Generalization"
+ return generalization_association(owner_xmi_id, link) if link.name == "Generalization"
- xmi_id = link.attributes["start"].value
+ xmi_id = link.attributes[link_member_name].value
member_end = lookup_entity_name(xmi_id) || connector_source_name(xmi_id)
if link.name == "Association"
- assoc_connector = main_model.xpath(%(//connector[@xmi:idref="#{link['xmi:id']}"]/target)).first
+ connector_type = link_member_name == "start" ? "source" : "target"
+ assoc_connector = main_model.xpath(%(//connector[@xmi:idref="#{link['xmi:id']}"]/#{connector_type})).first
if assoc_connector
connector_type = assoc_connector.children.find { |node| node.name == 'type' }
if connector_type && connector_type.attributes['multiplicity']
cardinality = connector_type.attributes['multiplicity']&.value&.split('..')
cardinality.unshift('1') if cardinality.length == 1
@@ -232,11 +238,11 @@
end
[member_end, "aggregation", member_end_cardinality, member_end_attribute_name]
end
- def generalization_association(owned_xmi_id, link)
- if link.attributes["start"].value == owned_xmi_id
+ def generalization_association(owner_xmi_id, link)
+ if link.attributes["start"].value == owner_xmi_id
xmi_id = link.attributes["end"].value
member_end_type = "inheritance"
member_end = lookup_entity_name(xmi_id) || connector_target_name(xmi_id)
else
xmi_id = link.attributes["start"].value