blob: 1fc10c472ad5e39e5d35cdc9b41c337a1dc04fea [file] [log] [blame]
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;
}
}