### Eclipse Workspace Patch 1.0 #P org.eclipse.gmf.common Index: src/org/eclipse/gmf/internal/common/migrate/MigrationDelegate.java =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.common/src/org/eclipse/gmf/internal/common/migrate/MigrationDelegate.java,v retrieving revision 1.2 diff -u -r1.2 MigrationDelegate.java --- src/org/eclipse/gmf/internal/common/migrate/MigrationDelegate.java 28 May 2007 13:43:40 -0000 1.2 +++ src/org/eclipse/gmf/internal/common/migrate/MigrationDelegate.java 30 May 2007 16:05:46 -0000 @@ -15,7 +15,7 @@ import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.xmi.XMLResource; +import org.eclipse.emf.ecore.resource.Resource; public interface MigrationDelegate { @@ -33,7 +33,9 @@ public boolean isMigrationApplied(); - public String getID(EObject obj); + public void setResource(Resource resource); - public void setResource(XMLResource resource); + public boolean setManyReference(EObject object, EStructuralFeature feature, Object[] values); + + public EObject findEObject(String uriFragment); } Index: src/org/eclipse/gmf/internal/common/migrate/MigrationHelper.java =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.common/src/org/eclipse/gmf/internal/common/migrate/MigrationHelper.java,v retrieving revision 1.6 diff -u -r1.6 MigrationHelper.java --- src/org/eclipse/gmf/internal/common/migrate/MigrationHelper.java 28 May 2007 13:43:40 -0000 1.6 +++ src/org/eclipse/gmf/internal/common/migrate/MigrationHelper.java 30 May 2007 16:05:46 -0000 @@ -10,11 +10,14 @@ */ package org.eclipse.gmf.internal.common.migrate; +import java.util.List; + import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.xmi.XMIException; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.XMIHelperImpl; @@ -43,18 +46,14 @@ } @Override - public String getID(EObject obj) { - String result = myDelegate.getID(obj); - if (result == null) { - result = super.getID(obj); + public List setManyReference(ManyReference reference, String location) { + List result = null; + if (!myDelegate.setManyReference(reference.getObject(), reference.getFeature(), reference.getValues())) { + result = super.setManyReference(reference, location); } return result; } - public void setXMLMap(XMLResource.XMLMap map) { - //map.setIDAttributeName(""); - } - @Override public void setValue(EObject object, EStructuralFeature feature, Object value, int position) { if (!myDelegate.setValue(object, feature, value, position)) { @@ -86,4 +85,8 @@ myDelegate.postProcess(); } + public EObject findEObject(String uriFragment) { + return myDelegate.findEObject(uriFragment); + } + } Index: src/org/eclipse/gmf/internal/common/migrate/MigrationResource.java =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.common/src/org/eclipse/gmf/internal/common/migrate/MigrationResource.java,v retrieving revision 1.14 diff -u -r1.14 MigrationResource.java --- src/org/eclipse/gmf/internal/common/migrate/MigrationResource.java 24 May 2007 09:34:42 -0000 1.14 +++ src/org/eclipse/gmf/internal/common/migrate/MigrationResource.java 30 May 2007 16:05:46 -0000 @@ -16,6 +16,7 @@ import java.util.Map; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.xmi.XMLHelper; import org.eclipse.gmf.internal.common.ToolingResourceFactory.ToolResource; @@ -42,6 +43,12 @@ } } + @Override + public EObject getEObject(String uriFragment) { + EObject result = myMigrationHelper != null ? myMigrationHelper.findEObject(uriFragment) : null; + return result == null ? super.getEObject(uriFragment) : result; + } + protected void handlePostLoadSuccess() { if (myMigrationHelper != null && myMigrationHelper.isMigrationApplied()) { Diagnostic diagnostic = MigrationResource.createMessageDiagnostic(this, Messages.oldModelVersionLoadedMigrationRequired); Index: src/org/eclipse/gmf/internal/common/migrate/MigrationDelegateImpl.java =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.common/src/org/eclipse/gmf/internal/common/migrate/MigrationDelegateImpl.java,v retrieving revision 1.2 diff -u -r1.2 MigrationDelegateImpl.java --- src/org/eclipse/gmf/internal/common/migrate/MigrationDelegateImpl.java 28 May 2007 13:43:40 -0000 1.2 +++ src/org/eclipse/gmf/internal/common/migrate/MigrationDelegateImpl.java 30 May 2007 16:05:46 -0000 @@ -26,7 +26,7 @@ import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.EcorePackage; -import org.eclipse.emf.ecore.xmi.XMLResource; +import org.eclipse.emf.ecore.resource.Resource; public class MigrationDelegateImpl implements MigrationDelegate { private final EStructuralFeature myDeletedAttribute = EcoreFactory.eINSTANCE.createEAttribute(); @@ -44,7 +44,7 @@ private Map> myRenamedAttributes = new HashMap>(); private Map myRenamedTypes = new HashMap(); private Map> myRenamedParentAttributes = new HashMap>(); - private XMLResource myResource; + private Resource myResource; public void registerDeletedAttributes(EClassifier classifier, String... deletedAttrNames) { assert !myDeletedAttributes.containsKey(classifier); @@ -113,7 +113,7 @@ } return result; } - + public EClassifier getRenamedType(String typeName) { return myRenamedTypes.get(typeName); } @@ -156,16 +156,16 @@ return null; } - public String getID(EObject obj) { - return null; - } - public void postProcess() { } public void processObject(EObject result) { } + public boolean setManyReference(EObject object, EStructuralFeature feature, Object[] values) { + return false; + } + public boolean isMigrationApplied() { return isMigrationApplied; } @@ -201,11 +201,15 @@ return attr; } - public void setResource(XMLResource resource) { + public void setResource(Resource resource) { myResource = resource; } - protected XMLResource getResource() { + protected Resource getResource() { return myResource; } + + public EObject findEObject(String uriFragment) { + return null; + } } \ No newline at end of file #P org.eclipse.gmf.graphdef Index: src/org/eclipse/gmf/internal/graphdef/util/MigrationDelegate.java =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.graphdef/src/org/eclipse/gmf/internal/graphdef/util/MigrationDelegate.java,v retrieving revision 1.2 diff -u -r1.2 MigrationDelegate.java --- src/org/eclipse/gmf/internal/graphdef/util/MigrationDelegate.java 29 May 2007 13:41:35 -0000 1.2 +++ src/org/eclipse/gmf/internal/graphdef/util/MigrationDelegate.java 30 May 2007 16:05:47 -0000 @@ -10,31 +10,38 @@ */ package org.eclipse.gmf.internal.graphdef.util; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.resource.impl.ResourceImpl; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gmf.gmfgraph.ChildAccess; import org.eclipse.gmf.gmfgraph.Compartment; +import org.eclipse.gmf.gmfgraph.CustomFigure; +import org.eclipse.gmf.gmfgraph.DecorationFigure; import org.eclipse.gmf.gmfgraph.DiagramElement; import org.eclipse.gmf.gmfgraph.DiagramLabel; import org.eclipse.gmf.gmfgraph.Figure; +import org.eclipse.gmf.gmfgraph.FigureAccessor; import org.eclipse.gmf.gmfgraph.FigureDescriptor; import org.eclipse.gmf.gmfgraph.FigureGallery; import org.eclipse.gmf.gmfgraph.GMFGraphFactory; import org.eclipse.gmf.gmfgraph.GMFGraphPackage; -import org.eclipse.gmf.gmfgraph.Node; +import org.eclipse.gmf.gmfgraph.PolylineConnection; import org.eclipse.gmf.gmfgraph.RealFigure; import org.eclipse.gmf.internal.common.migrate.MigrationDelegateImpl; class MigrationDelegate extends MigrationDelegateImpl { private EReference myFigure_RefElements; - - //private FigureGallery myDefaultCreatedFigureGallery; + private Map myId2EObject; + private boolean isPostprocessingFinished; + private Collection myProxiesToResolve; MigrationDelegate() { } @@ -45,18 +52,40 @@ registerDeletedAttributes(GMFGraphPackage.eINSTANCE.getCustomClass(), "bundleName"); //$NON-NLS-1$ - myFigure_RefElements = createNewReference("referencingElements", GMFGraphPackage.eINSTANCE.getDiagramElement(), false); //$NON-NLS-1$ + myFigure_RefElements = createNewReference("referencingElementsFake", GMFGraphPackage.eINSTANCE.getDiagramElement(), false); //$NON-NLS-1$ registerRenamedParentAttribute(GMFGraphPackage.eINSTANCE.getFigure(), "referencingElements", myFigure_RefElements); //$NON-NLS-1$ + registerRenamedAttribute(GMFGraphPackage.eINSTANCE.getFigureAccessor(), "referencingElements", myFigure_RefElements); //$NON-NLS-1$ + + myId2EObject = null; + isPostprocessingFinished = false; } @Override public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) { - if (myFigure_RefElements.equals(feature)) { + // during load + + if (object instanceof Figure && "name".equals(feature.getName())) { + // this feature used to be id in old versions, so need to emulate this during processing + String name = (String) value; + saveEObjectIdLocally(object, name); + } + + // after end of document, handling forward references: + + if (GMFGraphPackage.eINSTANCE.getFigureAccessor_TypedFigure().equals(feature) && value instanceof CustomFigure) { + CustomFigure custom = (CustomFigure) value; + if (custom.eIsProxy()) { + // this could happen in case of having "href" attribute, i.e. + // in the case of reference, that now has changed to be containment + saveReferenceToGetContainmentLater(custom); + } + } + if (myFigure_RefElements.equals(feature) && object instanceof Figure) { Figure figure = (Figure) object; // can be FigureRef as well + FigureDescriptor figureDescriptor = figure.getDescriptor(); RealFigure topLevel = findTopLevelFigure(figure); - FigureDescriptor figureDescriptor = getOrCreateFigureDescriptorFor(topLevel); - if (figure instanceof RealFigure) { //XXX!!! think smth out! - replaceFigureIdWithDescriptorIdInResolve(figureDescriptor, ((RealFigure) figure).getName()); + if (figureDescriptor == null) { + figureDescriptor = getOrCreateFigureDescriptorFor(topLevel); } if (!figure.equals(topLevel)) { ChildAccess access = getOrCreateChildAccessForNested(figure, figureDescriptor); @@ -64,6 +93,79 @@ setNestedFigureAccessFor(node, access); } fireMigrationApplied(true); + } else if (myFigure_RefElements.equals(feature) && object instanceof FigureAccessor) { + FigureAccessor accessor = (FigureAccessor) object; + CustomFigure customFigure = findParentCustomFigure(accessor); + RealFigure figure = getOrCreateTypedFigure(accessor); + FigureDescriptor figureDescriptor = figure.getDescriptor(); + RealFigure topLevel = findTopLevelFigure(customFigure); + if (figureDescriptor == null) { + figureDescriptor = getOrCreateFigureDescriptorFor(topLevel); + } + if (!figure.equals(topLevel)) { + ChildAccess access = getOrCreateChildAccessForNested(figure, figureDescriptor); + DiagramElement node = (DiagramElement) value; + setNestedFigureAccessFor(node, access); + } + fireMigrationApplied(true); + } else if (GMFGraphPackage.eINSTANCE.getDiagramElement_Figure().equals(feature) && value instanceof Figure) { + // as long as we have added ids for figure references in postProcess(), the id used here + // can be resolved either as Figure (old version) or FigureDescriptor(new ones) - and this + // should happen ONLY for old versions (or due to our wrong id reference resolving with + // myId2EObject map) + Figure figure = (Figure) value; + if (figure.eIsProxy()) { + figure = (Figure) EcoreUtil.resolve(figure, object); + } + FigureDescriptor figureDescriptor = figure.getDescriptor(); + if (figureDescriptor == null) { + RealFigure topLevel = findTopLevelFigure(figure); + figureDescriptor = getOrCreateFigureDescriptorFor(topLevel); + } + DiagramElement diagramElement = (DiagramElement) object; + diagramElement.setFigure(figureDescriptor); + fireMigrationApplied(true); + } else if (GMFGraphPackage.eINSTANCE.getDiagramElement_Figure().equals(feature) && value instanceof FigureAccessor) { + // as FigureAccess could be referenced before in DiagramLabels and Containments along with Figures, + // but, since now being not a Figure, do not have a Descriptor, so we use its TypedFigure's one + // (creating default one if none exists) - and this should happen ONLY for old versions (or due to our + // wrong id reference resolving with myId2EObject map). + FigureAccessor accessor = (FigureAccessor) value; + if (accessor.eIsProxy()) { + accessor = (FigureAccessor) EcoreUtil.resolve(accessor, object); + } + RealFigure figure = getOrCreateTypedFigure(accessor); + FigureDescriptor figureDescriptor = figure.getDescriptor(); + if (figureDescriptor == null) { + CustomFigure customFigure = findParentCustomFigure(accessor); + RealFigure topLevel = findTopLevelFigure(customFigure); + figureDescriptor = getOrCreateFigureDescriptorFor(topLevel); + } + DiagramElement diagramElement = (DiagramElement) object; + diagramElement.setFigure(figureDescriptor); + ChildAccess access = getOrCreateChildAccessForNested(figure, figureDescriptor); + setNestedFigureAccessFor(diagramElement, access); + fireMigrationApplied(true); + } else if (GMFGraphPackage.eINSTANCE.getPolylineConnection_SourceDecoration().equals(feature) && value instanceof FigureDescriptor) { + // as in old version a name is used for id of referenced figure, and now we set this name + // for its figure descriptor, if the figure is directly nested into it, - we could receive + // an instanceof descriptor resolved for this id value + FigureDescriptor figureDescriptor = (FigureDescriptor) value; + // ClassCast here will signal us of our id resolving mistakes: + DecorationFigure toplevelFigureInstead = (DecorationFigure) figureDescriptor.getActualFigure(); + PolylineConnection connection = (PolylineConnection) object; + connection.setSourceDecoration(toplevelFigureInstead); + fireMigrationApplied(true); + } else if (GMFGraphPackage.eINSTANCE.getPolylineConnection_TargetDecoration().equals(feature) && value instanceof FigureDescriptor) { + // as in old version a name is used for id of referenced figure, and now we set this name + // for its figure descriptor, if the figure is directly nested into it, - we could receive + // an instanceof descriptor resolved for this id value + FigureDescriptor figureDescriptor = (FigureDescriptor) value; + // ClassCast here will signal us of our id resolving mistakes: + DecorationFigure toplevelFigureInstead = (DecorationFigure) figureDescriptor.getActualFigure(); + PolylineConnection connection = (PolylineConnection) object; + connection.setTargetDecoration(toplevelFigureInstead); + fireMigrationApplied(true); } else { // other cases are would be processed as defaults return super.setValue(object, feature, value, position); @@ -71,34 +173,120 @@ return true; } + @Override + public boolean setManyReference(EObject object, EStructuralFeature feature, Object[] values) { + return myFigure_RefElements.equals(feature); + } + + @Override + public void postProcess() { + super.postProcess(); + Resource resource = getResource(); + // this is run BEFORE forward references handling + for (Iterator it=resource.getAllContents();it.hasNext();) { + EObject next = it.next(); + // we have changed metamodel structure, so URI-fragment references for Accessor could get + // invalid after resolving references in postprocessing, so we need to save them to preserve + if (next instanceof FigureAccessor) { + FigureAccessor customAccessor = (FigureAccessor) next; + String accessorUri = resource.getURIFragment(customAccessor); + saveEObjectIdLocally(customAccessor, accessorUri); + } + } + if (myId2EObject == null) { + isPostprocessingFinished = true; + return; + } + for (Iterator> it = myId2EObject.entrySet().iterator(); it.hasNext();) { + Map.Entry next = it.next(); + String id = next.getKey(); + EObject found = resource.getEObject(id); + if (found != null) { + next.setValue(found); + } + } + if (myProxiesToResolve == null) { + isPostprocessingFinished = true; + return; + } + for (EObject proxy : myProxiesToResolve) { + // these proxies are expected just to be references, used to be non-containment in the past, + // and interpreted by loader as proxies because of having "href" attribute + String last = EcoreUtil.getURI(proxy).lastSegment(); + EObject saved = myId2EObject.get(last); + if (proxy.eContainer() instanceof FigureAccessor) { + FigureAccessor accessor = (FigureAccessor) proxy.eContainer(); + // saved could be FigureDescriptor for migrated resources with proxy customFigure references + if (saved instanceof RealFigure) { + RealFigure copyOfResolved = (RealFigure) EcoreUtil.copy(saved); + accessor.setTypedFigure(copyOfResolved); + } else if (saved instanceof FigureDescriptor) { + FigureDescriptor descriptor = (FigureDescriptor) saved; + RealFigure copyOfResolved = (RealFigure) EcoreUtil.copy(descriptor.getActualFigure()); + accessor.setTypedFigure(copyOfResolved); + } + } + } + isPostprocessingFinished = true; + } + + @Override + public EObject findEObject(String uriFragment) { + if (!isPostprocessingFinished || myId2EObject == null) { + return null; + } + EObject result = myId2EObject.get(uriFragment); + return result; + } + + private void saveEObjectIdLocally(EObject object, String id) { + if (myId2EObject == null) { + myId2EObject = new HashMap(); + } + if (myId2EObject.get(id) == null) { + myId2EObject.put(id, object); + } else { + // collision with figure name expected only in new versions, as old ones used this as id + } + } + + private void saveReferenceToGetContainmentLater(EObject custom) { + if (myProxiesToResolve == null) { + myProxiesToResolve = new ArrayList(); + } + myProxiesToResolve.add(custom); + } + + private RealFigure getOrCreateTypedFigure(FigureAccessor accessor) { + RealFigure result = accessor.getTypedFigure(); + if (result == null) { + CustomFigure custom = GMFGraphFactory.eINSTANCE.createCustomFigure(); + // @see org.eclipse.gmf.codegen/templates/xpt/diagram/editparts/TextAware.xpt::labelSetterFigureClassName + custom.setQualifiedClassName("org.eclipse.draw2d.IFigure"); //$NON-NLS-1$ + accessor.setTypedFigure(custom); + result = custom; + } + return result; + } + + private CustomFigure findParentCustomFigure(FigureAccessor accessor) { + CustomFigure result = null; + if (accessor.eContainer() instanceof CustomFigure) { + result = (CustomFigure) accessor.eContainer(); + } + return result; + } + private void setNestedFigureAccessFor(DiagramElement dElem, ChildAccess access) { if (dElem instanceof DiagramLabel) { DiagramLabel label = (DiagramLabel) dElem; label.setAccessor(access); - } else if (dElem instanceof Node) { - Node node = (Node) dElem; - node.setContentPane(access); } else if (dElem instanceof Compartment) { Compartment bag = (Compartment) dElem; bag.setAccessor(access); } } - private void replaceFigureIdWithDescriptorIdInResolve(EObject figure, String name) { - //XXX: there is still problem with references for figures, when not only - // figureDescriptors are needed. For ex., see PolylineConnection.targetDecoration - Resource resource = getResource(); - if (resource instanceof ResourceImpl) { - ResourceImpl resourceImpl = (ResourceImpl) resource; - Map idMap = resourceImpl.getIntrinsicIDToEObjectMap(); - if (idMap == null) { - idMap = new HashMap(); - resourceImpl.setIntrinsicIDToEObjectMap(idMap); - } - idMap.put(name, figure); - } - } - private RealFigure findTopLevelFigure(Figure figure) { RealFigure result = figure instanceof RealFigure ? (RealFigure) figure : null; while (result.eContainer() instanceof RealFigure) { @@ -135,17 +323,4 @@ } return descriptor; } - -// private FigureGallery getOrCreateFigureGalleryOnce(Figure figure) { -// if (myDefaultCreatedFigureGallery == null) { -// myDefaultCreatedFigureGallery = GMFGraphFactory.eINSTANCE.createFigureGallery(); -// if (figure.eContainer() instanceof Canvas) { -// Canvas canvas = (Canvas) figure.eContainer(); -// canvas.getFigures().add(myDefaultCreatedFigureGallery); -// } else { -// figure.eResource().getContents().add(myDefaultCreatedFigureGallery); -// } -// } -// return myDefaultCreatedFigureGallery; -// } } #P org.eclipse.gmf.codegen.ui Index: plugin.xml =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.codegen.ui/plugin.xml,v retrieving revision 1.21 diff -u -r1.21 plugin.xml --- plugin.xml 28 May 2007 11:49:49 -0000 1.21 +++ plugin.xml 30 May 2007 16:05:48 -0000 @@ -62,6 +62,19 @@ + + + + + #P org.eclipse.gmf.tests Index: src/org/eclipse/gmf/tests/migration/MigrationPatchesTest.java =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/tests/org.eclipse.gmf.tests/src/org/eclipse/gmf/tests/migration/MigrationPatchesTest.java,v retrieving revision 1.18 diff -u -r1.18 MigrationPatchesTest.java --- src/org/eclipse/gmf/tests/migration/MigrationPatchesTest.java 29 May 2007 13:41:34 -0000 1.18 +++ src/org/eclipse/gmf/tests/migration/MigrationPatchesTest.java 30 May 2007 16:05:50 -0000 @@ -43,8 +43,10 @@ import org.eclipse.gmf.gmfgraph.FlowLayout; import org.eclipse.gmf.gmfgraph.Label; import org.eclipse.gmf.gmfgraph.LabeledContainer; +import org.eclipse.gmf.gmfgraph.LineKind; import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.gmfgraph.PolylineConnection; +import org.eclipse.gmf.gmfgraph.PolylineDecoration; import org.eclipse.gmf.gmfgraph.Rectangle; import org.eclipse.gmf.internal.common.ToolingResourceFactory; import org.eclipse.gmf.internal.common.migrate.MigrationResource; @@ -459,7 +461,7 @@ URI newUri = temporarySaveMigratedModel(gmfgraphFileName, "basic", "gmfgraph"); changeNsUriToOldOne(newUri, "gmfgraph", "http://www.eclipse.org/gmf/2005/GraphicalDefinition"); - //assertOnLoadModelMigrationDidNothing(newUri); + assertOnLoadModelMigrationDidNothing(newUri); checkAllFigureReferences(newUri); } @@ -479,9 +481,16 @@ FigureGallery fg = canvas.getFigures().get(0); assertEquals("GenericDiagramFigures", fg.getName()); - assertTrue(fg.getFigures().isEmpty()); + assertFalse(fg.getFigures().isEmpty()); + assertEquals(1, fg.getFigures().size()); + + Figure figure0 = fg.getFigures().get(0); + assertTrue(figure0 instanceof PolylineDecoration); + PolylineDecoration linked = (PolylineDecoration) figure0; + assertEquals("ArrowDecoration", linked.getName()); + assertFalse(fg.getDescriptors().isEmpty()); - assertEquals(5, fg.getDescriptors().size()); + assertEquals(6, fg.getDescriptors().size()); FigureDescriptor fg1 = fg.getDescriptors().get(0); assertTrue(fg1.getAccessors().isEmpty()); @@ -545,6 +554,16 @@ assertEquals(1, nnr.getDescriptor().getAccessors().size()); assertEquals(nnrLabel, nnr.getDescriptor().getAccessors().get(0).getFigure()); + Figure figure6 = fg.getDescriptors().get(5).getActualFigure(); + assertTrue(figure6 instanceof PolylineConnection); + PolylineConnection fcf = (PolylineConnection) figure6; + assertEquals("FigureConnectionFigure", fcf.getName()); + assertEquals(LineKind.LINE_DASHDOT_LITERAL, fcf.getLineKind()); + assertNotNull(fcf.getTargetDecoration()); + assertEquals(linked, fcf.getTargetDecoration()); + assertNotNull(fcf.getDescriptor()); + assertEquals(fcf, fcf.getDescriptor().getActualFigure()); + assertNotNull(canvas.getNodes()); assertFalse(canvas.getNodes().isEmpty()); assertEquals(2, canvas.getNodes().size()); @@ -583,4 +602,32 @@ assertEquals("LabelWOIcon", l3.getName()); } + public void testCustomFigures() throws Exception { + URI gmfgraphFileName = createURI("customFigures.gmfgraph"); //$NON-NLS-1$ + + Exception caughtGenException = assertOrdinaryLoadModelProblems(gmfgraphFileName); + assertTrue("expected diagnostic exception", caughtGenException != null); //$NON-NLS-1$ + + assertOnLoadModelMigrationSuccess(gmfgraphFileName); + + URI newUri = temporarySaveMigratedModel(gmfgraphFileName, "customFigures", "gmfgraph"); + changeNsUriToOldOne(newUri, "gmfgraph", "http://www.eclipse.org/gmf/2005/GraphicalDefinition"); + + assertOnLoadModelMigrationDidNothing(newUri); + } + + public void testMultifiles() throws Exception { + URI gmfgraphFileName = createURI("multifile_main.gmfgraph"); //$NON-NLS-1$ + + Exception caughtGenException = assertOrdinaryLoadModelProblems(gmfgraphFileName); + assertTrue("expected diagnostic exception", caughtGenException != null); //$NON-NLS-1$ + + assertOnLoadModelMigrationSuccess(gmfgraphFileName); + + URI newUri = temporarySaveMigratedModel(gmfgraphFileName, "multifile_main", "gmfgraph"); + changeNsUriToOldOne(newUri, "gmfgraph", "http://www.eclipse.org/gmf/2005/GraphicalDefinition"); + + assertOnLoadModelMigrationDidNothing(newUri); + } + } Index: models/migration/basic.gmfgraph =================================================================== RCS file: /cvsroot/modeling/org.eclipse.gmf/tests/org.eclipse.gmf.tests/models/migration/basic.gmfgraph,v retrieving revision 1.1 diff -u -r1.1 basic.gmfgraph --- models/migration/basic.gmfgraph 28 May 2007 13:43:42 -0000 1.1 +++ models/migration/basic.gmfgraph 30 May 2007 16:05:49 -0000 @@ -49,6 +49,23 @@ referencingElements="NamedNode_Name" name="NamedNode_NameLabelFigure"/> + + +