lib/lutaml/xmi/parsers/xml.rb in lutaml-0.9.12 vs lib/lutaml/xmi/parsers/xml.rb in lutaml-0.9.13

- old
+ new

@@ -24,14 +24,15 @@ xmi_model = get_xmi_model(xml) new.parse(xmi_model) end # @param xml [String] path to xml + # @param with_gen [Boolean] # @return [Hash] - def serialize_xmi(xml) + def serialize_xmi(xml, with_gen: false) xmi_model = get_xmi_model(xml) - new.serialize_xmi(xmi_model) + new.serialize_xmi(xmi_model, with_gen: with_gen) end # @param xml [String] path to xml # @return [Liquid::Drop] def serialize_xmi_to_liquid(xml) @@ -55,75 +56,80 @@ Xmi::Sparx::SparxRoot.parse_xml(File.read(xml)) end end # @param xmi_model [Shale::Mapper] - # @return [Lutaml::Uml::Document] - def parse(xmi_model) + def set_xmi_model(xmi_model) @xmi_cache = {} @xmi_root_model = xmi_model + end + + # @param xmi_model [Shale::Mapper] + # @return [Lutaml::Uml::Document] + def parse(xmi_model) + set_xmi_model(xmi_model) serialized_hash = serialize_xmi(xmi_model) ::Lutaml::Uml::Document.new(serialized_hash) end # @param xmi_model [Shale::Mapper] # return [Hash] - def serialize_xmi(xmi_model) - @xmi_cache = {} - @xmi_root_model = xmi_model - serialize_to_hash(xmi_model) + def serialize_xmi(xmi_model, with_gen: false) + set_xmi_model(xmi_model) + serialize_to_hash(xmi_model, with_gen: with_gen) end # @param xmi_model [Shale::Mapper] # return [Liquid::Drop] def serialize_xmi_to_liquid(xmi_model) - @xmi_cache = {} - @xmi_root_model = xmi_model - serialized_hash = serialize_xmi(xmi_model) + set_xmi_model(xmi_model) + serialized_hash = serialize_xmi(xmi_model, with_gen: true) ::Lutaml::XMI::RootDrop.new(serialized_hash) end # @param xmi_model [Shale::Mapper] # @param name [String] # @return [Hash] def serialize_generalization_by_name(xmi_model, name) - @xmi_cache = {} - @xmi_root_model = xmi_model + set_xmi_model(xmi_model) klass = find_klass_packaged_element_by_name(name) - serialize_generalization(klass) + serialized_hash = serialize_generalization(klass) + + ::Lutaml::XMI::GeneralizationDrop.new(serialized_hash) end private # @param xmi_model [Shale::Mapper] # @return [Hash] # @note xpath: //uml:Model[@xmi:type="uml:Model"] - def serialize_to_hash(xmi_model) + def serialize_to_hash(xmi_model, with_gen: false) model = xmi_model.model { name: model.name, - packages: serialize_model_packages(model), + packages: serialize_model_packages(model, with_gen: with_gen), } end # @param model [Shale::Mapper] # @return [Array<Hash>] # @note xpath ./packagedElement[@xmi:type="uml:Package"] - def serialize_model_packages(model) + def serialize_model_packages(model, with_gen: false) model.packaged_element.select do |e| e.type?("uml:Package") end.map do |package| { xmi_id: package.id, name: get_package_name(package), - classes: serialize_model_classes(package, model), + classes: serialize_model_classes(package, model, + with_gen: with_gen), enums: serialize_model_enums(package), data_types: serialize_model_data_types(package), diagrams: serialize_model_diagrams(package.id), - packages: serialize_model_packages(package), + packages: serialize_model_packages(package, with_gen: with_gen), definition: doc_node_attribute_value(package.id, "documentation"), stereotype: doc_node_attribute_value(package.id, "stereotype"), } end end @@ -143,32 +149,45 @@ # @param package [Shale::Mapper] # @param model [Shale::Mapper] # @return [Array<Hash>] # @note xpath ./packagedElement[@xmi:type="uml:Class" or # @xmi:type="uml:AssociationClass"] - def serialize_model_classes(package, model) + def serialize_model_classes(package, model, with_gen: false) package.packaged_element.select do |e| e.type?("uml:Class") || e.type?("uml:AssociationClass") || e.type?("uml:Interface") end.map do |klass| - { - xmi_id: klass.id, - name: klass.name, - package: model, - type: klass.type.split(":").last, - attributes: serialize_class_attributes(klass), - associations: serialize_model_associations(klass.id), - operations: serialize_class_operations(klass), - constraints: serialize_class_constraints(klass.id), - is_abstract: doc_node_attribute_value(klass.id, "isAbstract"), - definition: doc_node_attribute_value(klass.id, "documentation"), - stereotype: doc_node_attribute_value(klass.id, "stereotype"), - } + build_klass_hash(klass, model, with_gen: with_gen) end end # @param klass [Shale::Mapper] + # @param model [Shale::Mapper] + # @return [Hash] + def build_klass_hash(klass, model, with_gen: false) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + klass_hash = { + xmi_id: klass.id, + name: klass.name, + package: model, + type: klass.type.split(":").last, + attributes: serialize_class_attributes(klass), + associations: serialize_model_associations(klass.id), + operations: serialize_class_operations(klass), + constraints: serialize_class_constraints(klass.id), + is_abstract: doc_node_attribute_value(klass.id, "isAbstract"), + definition: doc_node_attribute_value(klass.id, "documentation"), + stereotype: doc_node_attribute_value(klass.id, "stereotype"), + } + + if with_gen && klass.type?("uml:Class") + klass_hash[:generalization] = serialize_generalization(klass) + end + + klass_hash + end + + # @param klass [Shale::Mapper] # # @return [Hash] def serialize_generalization(klass) general_hash, next_general_node_id = get_top_level_general_hash(klass) return general_hash unless next_general_node_id @@ -235,14 +254,13 @@ end # @param general_node [Shale::Mapper] # # @return [Hash] def get_general_attributes(general_node) - attrs = serialize_class_attributes(general_node, with_assoc: true) + serialize_class_attributes(general_node, with_assoc: true) # turn on sorting if necessary # attrs.sort_by { |i| i[:name] } - attrs end # @param general_node [Shale::Mapper] # @return [String] def get_next_general_node_id(general_node) @@ -251,10 +269,12 @@ # @param general_id [String] # @return [Array<Hash>] def get_general_hash(general_id) general_node = get_general_node(general_id) + return [] unless general_node + general_node_attrs = get_general_attributes(general_node) general_upper_klass = find_upper_level_packaged_element(general_id) next_general_node_id = get_next_general_node_id(general_node) [ @@ -714,9 +734,11 @@ # @return [String] def get_ns_by_type(type) return unless type p = find_klass_packaged_element_by_name(type) + return unless p + find_upper_level_packaged_element(p.id) end # @param klass_id [String] # @return [Array<Hash>]