| import java.util.List; |
| |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.edapt.migration.CustomMigration; |
| import org.eclipse.emf.edapt.migration.MigrationException; |
| import org.eclipse.emf.edapt.spi.migration.Instance; |
| import org.eclipse.emf.edapt.spi.migration.Metamodel; |
| import org.eclipse.emf.edapt.spi.migration.Model; |
| |
| public class GMFGraphFigureDescriptorCustomMigration extends CustomMigration { |
| |
| private EReference reference; |
| |
| @Override |
| public void migrateBefore(Model model, Metamodel metamodel) |
| throws MigrationException { |
| reference = metamodel |
| .getEReference("gmfgraph.FigureHandle.referencingElements"); |
| } |
| |
| @Override |
| public void migrateAfter(Model model, Metamodel metamodel) |
| throws MigrationException { |
| for (Instance handle : model.getAllInstances("gmfgraph.FigureHandle")) { |
| List<Instance> elements = handle.unset(reference); |
| if (!elements.isEmpty()) { |
| Instance toplevel = getToplevel(handle); |
| Instance descriptor = getOrCreateDescriptor(toplevel, model); |
| for (Instance element : elements) { |
| element.set("figure", descriptor); |
| } |
| if (toplevel != handle) { |
| Instance access = getOrCreateAccess(descriptor, handle); |
| for (Instance element : elements) { |
| if (element.instanceOf("gmfgraph.DiagramLabel") |
| || element.instanceOf("gmfgraph.Compartment")) { |
| element.set("accessor", access); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| public Instance getToplevel(Instance handle) { |
| while (handle.getContainer().instanceOf("gmfgraph.FigureHandle")) { |
| handle = handle.getContainer(); |
| } |
| return handle; |
| } |
| |
| public Instance getOrCreateDescriptor(Instance toplevel, Model model) { |
| Instance gallery = toplevel.getContainer(); |
| if (gallery.instanceOf("gmfgraph.FigureDescriptor")) { |
| return gallery; |
| } |
| Instance descriptor = model.newInstance("gmfgraph.FigureDescriptor"); |
| descriptor.set("actualFigure", toplevel); |
| gallery.remove("figures", toplevel); |
| gallery.add("descriptors", descriptor); |
| descriptor.set("name", toplevel.get("name")); |
| return descriptor; |
| } |
| |
| public Instance getOrCreateAccess(Instance descriptor, Instance handle) { |
| Instance figure = null; |
| if (handle.instanceOf("gmfgraph.FigureAccessor")) { |
| figure = handle.getLink("typedFigure"); |
| } else { |
| figure = handle; |
| } |
| Instance access = findAccess(descriptor, figure); |
| if (access == null) { |
| access = descriptor.getType().getModel() |
| .newInstance("gmfgraph.ChildAccess"); |
| access.set("figure", figure); |
| descriptor.add("accessors", access); |
| } |
| return access; |
| } |
| |
| public Instance findAccess(Instance descriptor, Instance figure) { |
| for (Instance access : descriptor.getLinks("accessors")) { |
| if (access.get("figure") == figure) { |
| return access; |
| } |
| } |
| return null; |
| } |
| } |