[commit] r2415 - in trunk: GME/Mga Tests/GPyUnit

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Fri Jan 17 14:08:29 CST 2014


Author: ksmyth
Date: Fri Jan 17 14:08:29 2014
New Revision: 2415

Log:
Fix deleting and changing archetype connpoints: deriveds must be deleted/changed first. Error message was 'Cannot delete Object, has nonempty collection' (MASTEROBJ collection was nonempty). (META-2667)

Modified:
   trunk/GME/Mga/MgaConnection.cpp
   trunk/GME/Mga/MgaConnection.h
   trunk/GME/Mga/MgaLibOps.cpp
   trunk/Tests/GPyUnit/test_instances.py

Modified: trunk/GME/Mga/MgaConnection.cpp
==============================================================================
--- trunk/GME/Mga/MgaConnection.cpp	Tue Jan 14 16:29:51 2014	(r2414)
+++ trunk/GME/Mga/MgaConnection.cpp	Fri Jan 17 14:08:29 2014	(r2415)
@@ -337,33 +337,32 @@
 void SingleObjTreeDelete(CoreObj &self, bool deleteself = true);
 
 
-bool RemoveConnPTask::Do(CoreObj self, std::vector<CoreObj> *peers) {
-		CoreObj fco = self[ATTRID_CONNROLE];
-		CoreObj target = self[ATTRID_XREF];
-		SingleObjTreeDelete(self);
-		COMTHROW(ObjForCore(fco)->Check());
+void MgaConnPointDelete(CoreObj& cobj)
+{
+		CoreObj fco = cobj[ATTRID_CONNROLE];
+		CoreObj target = cobj[ATTRID_XREF];
+		CoreObjs children = cobj[ATTRID_MASTEROBJ + ATTRID_COLLECTION];
+		ITERATE_THROUGH(children)
+		{
+			MgaConnPointDelete(ITER);
+		}
+		SingleObjTreeDelete(cobj);
 		ObjForCore(fco)->SelfMark(OBJEVENT_RELATION);
 		ObjForCore(target)->SelfMark(OBJEVENT_DISCONNECTED);
-		return true;
 }
 
-
-
 STDMETHODIMP CMgaConnPoint::Remove() {
 	CMgaProject *mgaproject = fco->mgaproject;
 	COMTRY_IN_TRANSACTION {
 		fco->CheckWrite();
-// removed		// do not allow deletion of inherited connpoints:
-//		if(CoreObj(cobj[ATTRID_MASTEROBJ])) COMTHROW(E_MGA_OP_REFUSED);  
-		RemoveConnPTask().DoWithDeriveds(cobj);;
+
+		CoreObj fco = cobj[ATTRID_CONNROLE];
+		MgaConnPointDelete(cobj);
+		COMTHROW(ObjForCore(fco)->Check());
 	} COMCATCH_IN_TRANSACTION(;);
 }
 
 
-
-
-
-
 // get conn points pointed at by this object
 HRESULT FCO::get_PartOfConns(IMgaConnPoints **pVal) {
 		COMTRY {
@@ -448,8 +447,10 @@
 			std::set<CoreObj> vv;
 			{
 				ITERATE_THROUGH(self[ATTRID_CONNROLE + ATTRID_COLLECTION]) {
-					if(CoreObj(ITER[ATTRID_MASTEROBJ])) vv.insert(ITER[ATTRID_MASTEROBJ]);
-					else RemoveConnPTask().DoWithDeriveds(ITER);;
+					if (CoreObj(ITER[ATTRID_MASTEROBJ]))
+						vv.insert(ITER[ATTRID_MASTEROBJ]);
+					else
+						MgaConnPointDelete(ITER);
 				}
 			}
 			ITERATE_THROUGH(base[ATTRID_CONNROLE + ATTRID_COLLECTION]) {

Modified: trunk/GME/Mga/MgaConnection.h
==============================================================================
--- trunk/GME/Mga/MgaConnection.h	Tue Jan 14 16:29:51 2014	(r2414)
+++ trunk/GME/Mga/MgaConnection.h	Fri Jan 17 14:08:29 2014	(r2415)
@@ -108,9 +108,8 @@
 	STDMETHOD(Remove)();
 };
 
-class RemoveConnPTask : public DeriveTreeTask {
-	bool Do(CoreObj self, std::vector<CoreObj> *peers = NULL);
-};
+void MgaConnPointDelete(CoreObj& cobj);
+
 
 class AddConnPTask : public DeriveTreeTask {
 	CComBSTR rolename;

Modified: trunk/GME/Mga/MgaLibOps.cpp
==============================================================================
--- trunk/GME/Mga/MgaLibOps.cpp	Tue Jan 14 16:29:51 2014	(r2414)
+++ trunk/GME/Mga/MgaLibOps.cpp	Fri Jan 17 14:08:29 2014	(r2415)
@@ -727,7 +727,7 @@
 					if(!CoreObj(ITER[ATTRID_MASTEROBJ])) {
 						CoreObj rr;
 						if(ObjForCore(newnode)->findroleobj(CComBSTR(ITER[ATTRID_NAME]), rr)) {
-							RemoveConnPTask().DoWithDeriveds(rr);
+							MgaConnPointDelete(rr);
 						}
 // todo: propagate
 						ITER[ATTRID_CONNROLE] = newnode;

Modified: trunk/Tests/GPyUnit/test_instances.py
==============================================================================
--- trunk/Tests/GPyUnit/test_instances.py	Tue Jan 14 16:29:51 2014	(r2414)
+++ trunk/Tests/GPyUnit/test_instances.py	Fri Jan 17 14:08:29 2014	(r2415)
@@ -2,7 +2,7 @@
 import os
 import win32com.client
 import GPyUnit.util
-from GPyUnit.util import dec_disable_early_binding
+from GPyUnit.util import dec_disable_early_binding, DispatchEx
 
 def _adjacent_file(file):
     import os.path
@@ -109,4 +109,39 @@
         self.assertEquals(list(range(1,50+1)), sorted([fco.RelID for fco in subtype.ChildFCOs]))
         self.project.CommitTransaction()
 
+    @dec_disable_early_binding
+    def test_RemoveArchetypeConnpoint(self):
+        self.project = GPyUnit.util.parse_xme(self.connstr)
+        self.project.BeginTransactionInNewTerr()
+        aspects = self.project.RootFolder.GetObjectByPathDisp("/@Aspects")
+        allproxy = self.project.RootFolder.GetObjectByPathDisp("/@Aspects/@AllRef")
+        subtype = self.project.RootFolder.DeriveRootObject(aspects, False)
+        allrefNew = subtype.CreateChildObject(allproxy.MetaRole)
+        stc = aspects.GetObjectByPathDisp("@SourceToConnector")
+        model = aspects.GetObjectByPathDisp("@Model")
+        stc.SetSrc(DispatchEx("Mga.MgaFCOs"), model)
+
+        self.project.CommitTransaction()
+        self.project.Save(r"MGA=C:\Users\meta\tmp.mga")
+
+    @dec_disable_early_binding
+    def test_Connection_RevertToBase(self):
+        self.project = GPyUnit.util.parse_xme(self.connstr)
+        self.project.Preferences = self.project.Preferences & (0xffffffff - 4) # MGAPREF_IGNORECONNCHECKS
+        self.project.BeginTransactionInNewTerr()
+        aspects = self.project.RootFolder.GetObjectByPathDisp("/@Aspects")
+        subtype = self.project.RootFolder.DeriveRootObject(aspects, False)
+        subtype2 = self.project.RootFolder.DeriveRootObject(subtype, False)
+        stc = subtype.GetObjectByPathDisp("@SourceToConnector")
+        model = subtype.GetObjectByPathDisp("@Model")
+        stc.SetSrc(DispatchEx("Mga.MgaFCOs"), model)
+        self.assertEqual(stc.Src.ID, model.ID)
+        
+        self.assertEqual(1, stc.CompareToBase([cp for cp in stc.ConnPoints if cp.ConnRole == 'src'][0]))
+        self.assertEqual(0, stc.CompareToBase([cp for cp in stc.ConnPoints if cp.ConnRole == 'dst'][0]))
+        stc.RevertToBase(None)
+
+        self.project.CommitTransaction()
+        self.project.Save(r"MGA=C:\Users\meta\tmp.mga")
+
 #GPyUnit.util.MUGenerator(globals(), TestInstances)


More information about the gme-commit mailing list