### Eclipse Workspace Patch 1.0 #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 29 May 2007 14:45:27 -0000 @@ -11,6 +11,7 @@ package org.eclipse.gmf.internal.graphdef.util; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.eclipse.emf.ecore.EObject; @@ -18,8 +19,10 @@ 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.DecorationFigure; import org.eclipse.gmf.gmfgraph.DiagramElement; import org.eclipse.gmf.gmfgraph.DiagramLabel; import org.eclipse.gmf.gmfgraph.Figure; @@ -27,14 +30,13 @@ 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; MigrationDelegate() { } @@ -45,18 +47,25 @@ 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$ } @Override public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) { + // 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 (myFigure_RefElements.equals(feature)) { 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 +73,41 @@ 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) + 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.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,23 +115,42 @@ return true; } - 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); - } + @Override + public boolean setManyReference(EObject object, EStructuralFeature feature, Object[] values) { + return myFigure_RefElements.equals(feature); } - 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 + @Override + public void postProcess() { + super.postProcess(); + // this is run BEFORE forward references handling + if (myId2EObject == null) { + return; + } Resource resource = getResource(); + for (Iterator it = myId2EObject.keySet().iterator(); it.hasNext();) { + String id = it.next(); + EObject found = resource.getEObject(id); + if (found == null) { + saveEObjectId2Resource(myId2EObject.get(id), id, resource); + } else { + // otherwise we leave proper id object - but this situation is potentially dangerous + } + } + } + + private void saveEObjectIdLocally(EObject object, String name) { + if (myId2EObject == null) { + myId2EObject = new HashMap(); + } + if (myId2EObject.get(name) == null) { + myId2EObject.put(name, object); + } else { + // collision with figure name expected only in new versions, as old ones used this as id + } + } + + private void saveEObjectId2Resource(EObject object, String name, Resource resource) { if (resource instanceof ResourceImpl) { ResourceImpl resourceImpl = (ResourceImpl) resource; Map idMap = resourceImpl.getIntrinsicIDToEObjectMap(); @@ -95,7 +158,22 @@ idMap = new HashMap(); resourceImpl.setIntrinsicIDToEObjectMap(idMap); } - idMap.put(name, figure); + EObject oldReference = idMap.get(name); + if (oldReference == null) { + idMap.put(name, object); + } else { + // otherwise we leave proper id object - but this situation is potentially dangerous + } + } + } + + private void setNestedFigureAccessFor(DiagramElement dElem, ChildAccess access) { + if (dElem instanceof DiagramLabel) { + DiagramLabel label = (DiagramLabel) dElem; + label.setAccessor(access); + } else if (dElem instanceof Compartment) { + Compartment bag = (Compartment) dElem; + bag.setAccessor(access); } } @@ -135,17 +213,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.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 29 May 2007 14:45:28 -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,7 @@ 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); } 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 29 May 2007 14:45:28 -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)) { 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 29 May 2007 14:45:28 -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); @@ -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,11 @@ return attr; } - public void setResource(XMLResource resource) { + public void setResource(Resource resource) { myResource = resource; } - protected XMLResource getResource() { + protected Resource getResource() { return myResource; } } \ No newline at end of file #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 29 May 2007 14:45:29 -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,18 @@ assertEquals("LabelWOIcon", l3.getName()); } + 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 29 May 2007 14:45:28 -0000 @@ -49,6 +49,23 @@ referencingElements="NamedNode_Name" name="NamedNode_NameLabelFigure"/> + + +