[Mobies-commit] [commit] r3633 - GReAT/trunk/Tools/MetaGME2UMX

ksmyth at redhat1.isis.vanderbilt.edu ksmyth at redhat1.isis.vanderbilt.edu
Tue Feb 1 12:26:15 CST 2011


Author: ksmyth
Date: Tue Feb  1 12:26:10 2011
New Revision: 3633

Log:
Support Connections with more than one Connector

Modified:
   GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp

Modified: GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp
==============================================================================
--- GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp	Tue Feb  1 12:05:19 2011	(r3632)
+++ GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp	Tue Feb  1 12:26:10 2011	(r3633)
@@ -1066,68 +1066,64 @@
 		trans(baseConnections, aclasses, std::mem_fun_ref(&MetaGME::BaseConnection::srcConnection));
 		trans(baseConnections, aclasses, std::mem_fun_ref(&MetaGME::BaseConnection::dstConnection));
 		std::set<MetaGME::AssociationClass> aclasses_ = flatten_set(aclasses);
-		if (aclasses_.size() == 0)
-			continue;
-		if (aclasses_.size() > 1)
-		{
-			throw udm_exception(string("Connection '") + string(connection.name()) + "' has more than one AssociationClass");
-		}
-		MetaGME::AssociationClass aclass = *aclasses_.begin();
-		MetaGME::Connector connector;
-		if (Uml::IsDerivedFrom(((MetaGME::AssociationClass_Members_Base)aclass.dstConnection_end()).type(), MetaGME::BaseConnection::meta)) {
-			connector = MetaGME::Connector::Cast(aclass.srcConnection_end());
-		} else {
-			connector = MetaGME::Connector::Cast(aclass.dstConnection_end());
-		}
-		std::set<MetaGME::ConnectorToDestination> ctodst = connector.dstFCO();
-		if (ctodst.size() != 1)
-		{
-			throw udm_exception(string("Connection '") + string(connection.name()) + "' does not have exactly one destination");
-		}
-		std::set<MetaGME::SourceToConnector> srctoc = connector.srcFCO();
-		if (srctoc.size() != 1)
-		{
-			throw udm_exception(string("Connection '") + string(connection.name()) + "' does not have exactly one source");
-		}
+		for (std::set<MetaGME::AssociationClass>::iterator aclassesIt = aclasses_.begin(); 
+				aclassesIt != aclasses_.end(); aclassesIt++) {
+			MetaGME::AssociationClass aclass = *aclassesIt;
+			MetaGME::Connector connector;
+			if (Uml::IsDerivedFrom(((MetaGME::AssociationClass_Members_Base)aclass.dstConnection_end()).type(), MetaGME::BaseConnection::meta)) {
+				connector = MetaGME::Connector::Cast(aclass.srcConnection_end());
+			} else {
+				connector = MetaGME::Connector::Cast(aclass.dstConnection_end());
+			}
+			std::set<MetaGME::ConnectorToDestination> ctodst = connector.dstFCO();
+			if (ctodst.size() != 1)
+			{
+				throw udm_exception(string("Connection '") + string(connection.name()) + "' does not have exactly one destination");
+			}
+			std::set<MetaGME::SourceToConnector> srctoc = connector.srcFCO();
+			if (srctoc.size() != 1)
+			{
+				throw udm_exception(string("Connection '") + string(connection.name()) + "' does not have exactly one source");
+			}
 
-		strmap prefMap;
-		ConverGeneralPreferenceToMap((string)connection.GeneralPreferences(), prefMap);
+			strmap prefMap;
+			ConverGeneralPreferenceToMap((string)connection.GeneralPreferences(), prefMap);
 		
-		MetaGME::BaseFCO dstFco = ctodst.begin()->dstFCO_end();
-		std::string dstrolename = GetValueForName("dRefParent",prefMap);
-		string dst_assoc_rolename = GetValueForName("dName",prefMap);
-		MetaGME::BaseFCO srcFco = srctoc.begin()->srcFCO_end();
-		string srcrolename = GetValueForName("sRefParent",prefMap);
-		string src_assoc_rolename = GetValueForName("sName",prefMap);
-
-		if (dstFco && dstrolename != "")
-		{
-			std::string dstrrolename = GetValueForName("rdRefParent", prefMap);
-			if (dstrrolename == "") {
-				dstrrolename = dstrolename + "_rev";
-			}
-			std::set<MetaGME::Reference> refport_containers = GetRefportContainers(RefByProxy(dstFco), connection);
-			if (ctodst.begin()->dstRolename() == "" && srctoc.begin()->srcRolename() == "") { // bidirectional connection
-				std::set<MetaGME::Reference> src_refport_containers = GetRefportContainers(RefByProxy(srcFco), connection);
-				std::copy(src_refport_containers.begin(), src_refport_containers.end(), set_inserter(refport_containers));
+			MetaGME::BaseFCO dstFco = ctodst.begin()->dstFCO_end();
+			std::string dstrolename = GetValueForName("dRefParent",prefMap);
+			string dst_assoc_rolename = GetValueForName("dName",prefMap);
+			MetaGME::BaseFCO srcFco = srctoc.begin()->srcFCO_end();
+			string srcrolename = GetValueForName("sRefParent",prefMap);
+			string src_assoc_rolename = GetValueForName("sName",prefMap);
+
+			if (dstFco && dstrolename != "")
+			{
+				std::string dstrrolename = GetValueForName("rdRefParent", prefMap);
+				if (dstrrolename == "") {
+					dstrrolename = dstrolename + "_rev";
+				}
+				std::set<MetaGME::Reference> refport_containers = GetRefportContainers(RefByProxy(dstFco), connection);
+				if (ctodst.begin()->dstRolename() == "" && srctoc.begin()->srcRolename() == "") { // bidirectional connection
+					std::set<MetaGME::Reference> src_refport_containers = GetRefportContainers(RefByProxy(srcFco), connection);
+					std::copy(src_refport_containers.begin(), src_refport_containers.end(), set_inserter(refport_containers));
+				}
+				CreateRefportContainerAssociation(connection, dst_assoc_rolename, dstrolename, dstrrolename, refport_containers, cd);
 			}
-			CreateRefportContainerAssociation(connection, dst_assoc_rolename, dstrolename, dstrrolename, refport_containers, cd);
-		}
 
-		if (srcFco && srcrolename != "")
-		{
-			std::string srcrrolename = GetValueForName("rsRefParent", prefMap);
-			if (srcrrolename == "") {
-				srcrrolename = srcrolename + "_rev";
-			}
-			std::set<MetaGME::Reference> refport_containers = GetRefportContainers(RefByProxy(srcFco), connection);
-			if (ctodst.begin()->dstRolename() == "" && srctoc.begin()->srcRolename() == "") { // bidirectional connection
-				std::set<MetaGME::Reference> dst_refport_containers = GetRefportContainers(RefByProxy(dstFco), connection);
-				std::copy(dst_refport_containers.begin(), dst_refport_containers.end(), set_inserter(refport_containers));
+			if (srcFco && srcrolename != "")
+			{
+				std::string srcrrolename = GetValueForName("rsRefParent", prefMap);
+				if (srcrrolename == "") {
+					srcrrolename = srcrolename + "_rev";
+				}
+				std::set<MetaGME::Reference> refport_containers = GetRefportContainers(RefByProxy(srcFco), connection);
+				if (ctodst.begin()->dstRolename() == "" && srctoc.begin()->srcRolename() == "") { // bidirectional connection
+					std::set<MetaGME::Reference> dst_refport_containers = GetRefportContainers(RefByProxy(dstFco), connection);
+					std::copy(dst_refport_containers.begin(), dst_refport_containers.end(), set_inserter(refport_containers));
+				}
+				CreateRefportContainerAssociation(connection, src_assoc_rolename, srcrolename, srcrrolename, refport_containers, cd);
 			}
-			CreateRefportContainerAssociation(connection, src_assoc_rolename, srcrolename, srcrrolename, refport_containers, cd);
 		}
-
 	}
 }
 


More information about the Mobies-commit mailing list