void transformer::to_enumeration(const processed_object& o, const profile& p) { BOOST_LOG_SEV(lg, debug) << "Object is an enumeration: " << o.id(); sml::enumeration e; update_element(e, o, p); dogen::sml::qname qn; qn.simple_name(unsigned_int); e.underlying_type(qn); dogen::sml::enumerator invalid; invalid.name("invalid"); invalid.documentation("Represents an uninitialised enum"); invalid.value("0"); e.enumerators().push_back(invalid); std::set<std::string> enumerator_names; enumerator_names.insert(invalid.name()); unsigned int pos(1); for (const auto& p : o.properties()) { auto enumerator(to_enumerator(p, pos++)); const auto i(enumerator_names.find(enumerator.name())); if (i != enumerator_names.end()) { BOOST_LOG_SEV(lg, error) << "Duplicate enumerator name: " << enumerator.name(); BOOST_THROW_EXCEPTION(transformation_error( "Duplicate enumerator name: " + enumerator.name())); } e.enumerators().push_back(enumerator); enumerator_names.insert(enumerator.name()); } context_.model().enumerations().insert(std::make_pair(e.name(), e)); }
void transformer::to_concept(const processed_object& o, const profile& p) { sml::concept c; update_element(c, o, p); for (const auto& prop : o.properties()) { auto property(to_property(prop)); property.type(to_nested_qname(prop.type())); update_model_references(property.type()); c.local_properties().push_back(property); } const auto i(context_.child_id_to_parent_ids().find(o.id())); c.is_child(i != context_.child_id_to_parent_ids().end()); if (c.is_child()) { if (i->second.empty()) { BOOST_LOG_SEV(lg, error) << empty_parent_container << o.id(); BOOST_THROW_EXCEPTION( transformation_error(empty_parent_container + o.id())); } for (const auto& concept_id : i->second) { const auto j(context_.id_to_qname().find(concept_id)); if (j == context_.id_to_qname().end()) { BOOST_LOG_SEV(lg, error) << "Object has a parent but " << " there is no QName mapping." << " Child ID: '" << o.id() << "' Parent ID: '" << concept_id << "'"; BOOST_THROW_EXCEPTION( transformation_error(parent_not_found + o.id())); } c.refines().push_back(j->second); } } const auto j(context_.parent_ids().find(o.id())); c.is_parent(j != context_.parent_ids().end()); context_.model().concepts().insert(std::make_pair(c.name(), c)); }
void transformer:: update_object(sml::object& ao, const processed_object& o, const profile& p) { update_element(ao, o, p); ao.is_fluent(p.is_fluent()); ao.is_visitable(p.is_visitable()); for (const auto us : p.unknown_stereotypes()) { const auto qn(to_qname(us)); using sml::relationship_types; ao.relationships()[relationship_types::modeled_concepts].push_back(qn); } for (const auto& p : o.properties()) { const auto property(to_property(p)); ao.local_properties().push_back(property); update_model_references(property.type()); } const auto i(context_.child_id_to_parent_ids().find(o.id())); if (i != context_.child_id_to_parent_ids().end()) { if (i->second.empty()) { BOOST_LOG_SEV(lg, error) << empty_parent_container << o.id(); BOOST_THROW_EXCEPTION( transformation_error(empty_parent_container + o.id())); } if (i->second.size() > 1) { BOOST_LOG_SEV(lg, error) << multiple_inheritance << o.id(); BOOST_THROW_EXCEPTION( transformation_error(multiple_inheritance + o.id())); } const auto parent_name(i->second.front()); const auto j(context_.id_to_qname().find(parent_name)); if (j == context_.id_to_qname().end()) { BOOST_LOG_SEV(lg, error) << "Object has a parent but " << " there is no QName mapping defined." << " Child ID: '" << o.id() << "' Parent ID: '" << parent_name << "'"; BOOST_THROW_EXCEPTION( transformation_error(parent_not_found + o.id())); } BOOST_LOG_SEV(lg, debug) << "Setting parent for: " << ao.name().simple_name() << " as " << j->second.simple_name(); ao.is_child(true); using sml::relationship_types; ao.relationships()[relationship_types::parents].push_back(j->second); } else { BOOST_LOG_SEV(lg, debug) << "Object has no parent: " << ao.name().simple_name(); } const auto j(context_.parent_ids().find(o.id())); ao.is_parent(j != context_.parent_ids().end()); ao.is_final(!ao.is_parent()); context_.id_to_qname().insert(std::make_pair(o.id(), ao.name())); ao.is_immutable(p.is_immutable()); if ((ao.is_parent() || ao.is_child()) && p.is_immutable()) { BOOST_LOG_SEV(lg, error) << immutabilty_with_inheritance << ao.name().simple_name(); BOOST_THROW_EXCEPTION( transformation_error(immutabilty_with_inheritance + ao.name().simple_name())); } }