[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