org.eclipse.sirius.tests.sample.migration.design.Draw2dToSiriusModelTransformer.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.sirius.tests.sample.migration.design.Draw2dToSiriusModelTransformer.java

Source

/*******************************************************************************
 * Copyright (c) 2012 THALES GLOBAL SERVICES.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.sirius.tests.sample.migration.design;

import java.io.File;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.Path;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.ConnectionRouter;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ResizableCompartmentEditPart;
import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.FanRouter;
import org.eclipse.gmf.runtime.draw2d.ui.internal.routers.RectilinearRouter;
import org.eclipse.gmf.runtime.notation.Size;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.sirius.common.tools.api.resource.FileProvider;
import org.eclipse.sirius.diagram.DDiagramElement;
import org.eclipse.sirius.diagram.DEdge;
import org.eclipse.sirius.diagram.DSemanticDiagram;
import org.eclipse.sirius.diagram.description.Layer;
import org.eclipse.sirius.diagram.description.filter.FilterDescription;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramEdgeEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramNameEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.IAbstractDiagramNodeEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramContainerEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramElementEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramListEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramNodeEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.AbstractDEdgeNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DDiagramEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DEdgeBeginNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DEdgeEndNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DEdgeNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeNameEditPart;
import org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin;
import org.eclipse.sirius.diagram.ui.tools.api.figure.SiriusWrapLabel;
import org.eclipse.sirius.diagram.ui.tools.internal.routers.DForestRouter;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.AbstractRepresentation;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.BasicLabelStyle;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Bordered;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.BorderedRepresentation;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Container;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.ContainerRepresentation;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Diagram;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Edge;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.EdgeRepresentation;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Filter;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.FontFormat;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.GraphicalElement;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.LabelAlignment;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.LabelPosition;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Layout;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.MigrationmodelerFactory;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.Node;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.NodeRepresentation;
import org.eclipse.sirius.tests.sample.migration.migrationmodeler.RoutingStyle;
import org.eclipse.sirius.viewpoint.description.RepresentationElementMapping;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;

import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;

/**
 * Class to get a view model equivalent the draw2d model to check that migration
 * preserve the draw2d infos.
 * 
 * @author <a href="mailto:esteban.dugueperoux@obeo.fr">Esteban Dugueperoux</a>
 */
@SuppressWarnings("restriction")
public class Draw2dToSiriusModelTransformer {

    private DDiagramEditPart dDiagramEditPart;

    /**
     * Default constructor.
     * 
     * @param dDiagramEditPart
     *            the {@link DDiagramEditPart} of a diagram editor for which get
     *            a Sirius model of what is displayed
     */
    public Draw2dToSiriusModelTransformer(DDiagramEditPart dDiagramEditPart) {
        this.dDiagramEditPart = dDiagramEditPart;
    }

    public Diagram getMigrationModel() {
        Diagram migrationDiagram = MigrationmodelerFactory.eINSTANCE.createDiagram();
        DSemanticDiagram dSemanticDiagram = (DSemanticDiagram) dDiagramEditPart.resolveDDiagram().get();
        migrationDiagram.setName(dSemanticDiagram.getName());
        org.eclipse.gmf.runtime.notation.Diagram diagramView = dDiagramEditPart.getDiagramView();
        Map<?, ?> editPartRegistry = dDiagramEditPart.getViewer().getEditPartRegistry();
        Map<Node, Node> semanticNodeToMigrationNodeMap = new HashMap<Node, Node>();
        Map<Container, Container> semanticContainerToMigrationContainerMap = new HashMap<Container, Container>();
        List<?> children = diagramView.getChildren();
        for (Object childObj : children) {
            Object value = editPartRegistry.get(childObj);
            if (childObj instanceof org.eclipse.gmf.runtime.notation.Node
                    && value instanceof IDiagramElementEditPart) {
                IDiagramElementEditPart diagramElementEditPart = (IDiagramElementEditPart) value;
                if (diagramElementEditPart instanceof IDiagramContainerEditPart) {
                    IDiagramContainerEditPart diagramContainerEditPart = (IDiagramContainerEditPart) diagramElementEditPart;
                    Container semanticContainer = (Container) diagramContainerEditPart
                            .resolveTargetSemanticElement();
                    Container migrationContainer = semanticContainerToMigrationContainerMap.get(semanticContainer);
                    if (migrationContainer == null) {
                        migrationContainer = MigrationmodelerFactory.eINSTANCE.createContainer();
                        migrationDiagram.getContainers().add(migrationContainer);
                        semanticContainerToMigrationContainerMap.put(semanticContainer, migrationContainer);
                    }
                    ContainerRepresentation containerRepresentation = getMigrationContainerRepresentation(
                            diagramContainerEditPart);
                    migrationContainer.getContainerRepresentations().add(containerRepresentation);
                } else if (diagramElementEditPart instanceof IDiagramListEditPart) {
                    IDiagramListEditPart diagramListEditPart = (IDiagramListEditPart) diagramElementEditPart;
                    Container semanticContainer = (Container) diagramElementEditPart.resolveTargetSemanticElement();
                    Container migrationContainer = semanticContainerToMigrationContainerMap.get(semanticContainer);
                    if (migrationContainer == null) {
                        migrationContainer = MigrationmodelerFactory.eINSTANCE.createContainer();
                        migrationDiagram.getContainers().add(migrationContainer);
                        semanticContainerToMigrationContainerMap.put(semanticContainer, migrationContainer);
                    }
                    ContainerRepresentation containerRepresentation = getMigrationContainerRepresentation(
                            diagramListEditPart);
                    migrationContainer.getContainerRepresentations().add(containerRepresentation);
                } else if (diagramElementEditPart instanceof IDiagramNodeEditPart) {
                    IDiagramNodeEditPart diagramNodeEditPart = (IDiagramNodeEditPart) diagramElementEditPart;
                    Node semanticNode = (Node) diagramNodeEditPart.resolveTargetSemanticElement();
                    Node migrationNode = semanticNodeToMigrationNodeMap.get(semanticNode);
                    if (migrationNode == null) {
                        migrationNode = MigrationmodelerFactory.eINSTANCE.createNode();
                        migrationDiagram.getNodes().add(migrationNode);
                        semanticNodeToMigrationNodeMap.put(semanticNode, migrationNode);
                    }
                    NodeRepresentation nodeRepresentation = getMigrationNodeRepresentation(diagramNodeEditPart);
                    migrationNode.getNodeRepresentations().add(nodeRepresentation);
                }
            }
        }
        List<?> edges = diagramView.getEdges();
        Map<Edge, Edge> semanticEdgeToMigrationEdgeMap = new HashMap<Edge, Edge>();
        for (Object obj : edges) {
            Object value = editPartRegistry.get(obj);
            if (obj instanceof org.eclipse.gmf.runtime.notation.Edge
                    && value instanceof AbstractDiagramEdgeEditPart) {
                AbstractDiagramEdgeEditPart abstractDiagramEdgeEditPart = (AbstractDiagramEdgeEditPart) value;
                Edge semanticEdge = (Edge) abstractDiagramEdgeEditPart.resolveTargetSemanticElement();
                Edge migrationEdge = semanticEdgeToMigrationEdgeMap.get(semanticEdge);
                if (migrationEdge == null) {
                    migrationEdge = MigrationmodelerFactory.eINSTANCE.createEdge();
                    migrationDiagram.getEdges().add(migrationEdge);
                    semanticEdgeToMigrationEdgeMap.put(semanticEdge, migrationEdge);
                }
                EdgeRepresentation migrationEdgeRepresentation = getMigrationEdgeRepresentation(
                        abstractDiagramEdgeEditPart);
                migrationEdge.getEdgeRepresentations().add(migrationEdgeRepresentation);
                // Set source
                EditPart sourceEditPart = abstractDiagramEdgeEditPart.getSource();
                if (sourceEditPart instanceof IDiagramContainerEditPart
                        || sourceEditPart instanceof IDiagramListEditPart) {
                    Container semanticContainer = (Container) ((IDiagramElementEditPart) sourceEditPart)
                            .resolveTargetSemanticElement();
                    Container migrationContainer = semanticContainerToMigrationContainerMap.get(semanticContainer);
                    migrationEdge.setSource(migrationContainer);
                } else if (sourceEditPart instanceof IDiagramNodeEditPart) {
                    Node semanticNode = (Node) ((IDiagramElementEditPart) sourceEditPart)
                            .resolveTargetSemanticElement();
                    Node migrationNode = semanticNodeToMigrationNodeMap.get(semanticNode);
                    migrationEdge.setSource(migrationNode);
                }
                // Set target
                EditPart targetEditPart = abstractDiagramEdgeEditPart.getTarget();
                if (targetEditPart instanceof IDiagramContainerEditPart
                        || targetEditPart instanceof IDiagramListEditPart) {
                    Container semanticContainer = (Container) ((IDiagramElementEditPart) targetEditPart)
                            .resolveTargetSemanticElement();
                    Container migrationContainer = semanticContainerToMigrationContainerMap.get(semanticContainer);
                    migrationEdge.setTarget(migrationContainer);
                } else if (targetEditPart instanceof IDiagramNodeEditPart) {
                    Node semanticNode = (Node) ((IDiagramElementEditPart) targetEditPart)
                            .resolveTargetSemanticElement();
                    Node migrationNode = semanticNodeToMigrationNodeMap.get(semanticNode);
                    migrationEdge.setTarget(migrationNode);
                }
            }
        }

        setFilters(dSemanticDiagram, migrationDiagram);
        setLayers(dSemanticDiagram, migrationDiagram);

        Iterator<EObject> it = migrationDiagram.eAllContents();
        while (it.hasNext()) {
            EObject eObject = it.next();
            if (eObject instanceof AbstractRepresentation) {
                AbstractRepresentation element = (AbstractRepresentation) eObject;
                if (!isPresentInDiagram(element, dSemanticDiagram)) {
                    element.setDisplayed(false);
                }
            }
        }
        return migrationDiagram;
    }

    public void updateMigrationModel(Diagram migrationDiagram) {
        clearRepresentations(migrationDiagram);
        DSemanticDiagram dSemanticDiagram = (DSemanticDiagram) dDiagramEditPart.resolveDDiagram().get();
        migrationDiagram.setName(dSemanticDiagram.getName());
        org.eclipse.gmf.runtime.notation.Diagram diagramView = dDiagramEditPart.getDiagramView();
        Map<?, ?> editPartRegistry = dDiagramEditPart.getViewer().getEditPartRegistry();
        List<?> children = diagramView.getChildren();
        for (Object childObj : children) {
            Object value = editPartRegistry.get(childObj);
            if (childObj instanceof org.eclipse.gmf.runtime.notation.Node
                    && value instanceof IDiagramElementEditPart) {
                IDiagramElementEditPart diagramElementEditPart = (IDiagramElementEditPart) value;
                if (diagramElementEditPart instanceof IDiagramContainerEditPart) {
                    IDiagramContainerEditPart diagramContainerEditPart = (IDiagramContainerEditPart) diagramElementEditPart;
                    Container container = (Container) diagramContainerEditPart.resolveTargetSemanticElement();
                    ContainerRepresentation containerRepresentation = getMigrationContainerRepresentation(
                            diagramContainerEditPart);
                    container.getContainerRepresentations().add(containerRepresentation);
                } else if (diagramElementEditPart instanceof IDiagramListEditPart) {
                    IDiagramListEditPart diagramListEditPart = (IDiagramListEditPart) diagramElementEditPart;
                    Container container = (Container) diagramElementEditPart.resolveTargetSemanticElement();
                    ContainerRepresentation containerRepresentation = getMigrationContainerRepresentation(
                            diagramListEditPart);
                    container.getContainerRepresentations().add(containerRepresentation);
                } else if (diagramElementEditPart instanceof IDiagramNodeEditPart) {
                    IDiagramNodeEditPart diagramNodeEditPart = (IDiagramNodeEditPart) diagramElementEditPart;
                    Node node = (Node) diagramNodeEditPart.resolveTargetSemanticElement();
                    NodeRepresentation nodeRepresentation = getMigrationNodeRepresentation(diagramNodeEditPart);
                    node.getNodeRepresentations().add(nodeRepresentation);
                }
            }
        }
        List<?> edges = diagramView.getEdges();
        for (Object obj : edges) {
            Object value = editPartRegistry.get(obj);
            if (obj instanceof org.eclipse.gmf.runtime.notation.Edge
                    && value instanceof AbstractDiagramEdgeEditPart) {
                AbstractDiagramEdgeEditPart abstractDiagramEdgeEditPart = (AbstractDiagramEdgeEditPart) value;
                Edge edge = (Edge) abstractDiagramEdgeEditPart.resolveTargetSemanticElement();
                EdgeRepresentation migrationEdgeRepresentation = getMigrationEdgeRepresentation(
                        abstractDiagramEdgeEditPart);
                edge.getEdgeRepresentations().add(migrationEdgeRepresentation);
            }
        }

        setFilters(dSemanticDiagram, migrationDiagram);
        setLayers(dSemanticDiagram, migrationDiagram);

        Iterator<EObject> it = migrationDiagram.eAllContents();
        while (it.hasNext()) {
            EObject eObject = it.next();
            if (eObject instanceof AbstractRepresentation) {
                AbstractRepresentation element = (AbstractRepresentation) eObject;
                if (!isPresentInDiagram(element, dSemanticDiagram)) {
                    element.setDisplayed(false);
                }
            }
        }
    }

    private void clearRepresentations(Diagram migrationDiagram) {
        for (Node node : migrationDiagram.getNodes()) {
            node.getNodeRepresentations().clear();
        }
        for (Container container : migrationDiagram.getContainers()) {
            container.getContainerRepresentations().clear();
            clearContainerElementRepresentations(container);
        }
        for (Edge edge : migrationDiagram.getEdges()) {
            edge.getEdgeRepresentations().clear();
        }
    }

    private void clearContainerElementRepresentations(Container container) {
        for (GraphicalElement graphicalElement : container.getElements()) {
            if (graphicalElement instanceof Node) {
                Node node = (Node) graphicalElement;
                node.getNodeRepresentations().clear();
            } else if (graphicalElement instanceof Bordered) {
                Bordered bordered = (Bordered) graphicalElement;
                bordered.getBorderedRepresentations().clear();
            } else if (graphicalElement instanceof Container) {
                Container subContainer = (Container) graphicalElement;
                subContainer.getContainerRepresentations().clear();
                clearContainerElementRepresentations(subContainer);
            }
        }
    }

    @SuppressWarnings("unchecked")
    private ContainerRepresentation getMigrationContainerRepresentation(IDiagramListEditPart diagramListEditPart) {
        ContainerRepresentation containerRepresentation = MigrationmodelerFactory.eINSTANCE
                .createContainerRepresentation();
        containerRepresentation.setMappingId(getMappingId(diagramListEditPart));
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.ContainerStyle containerStyle = MigrationmodelerFactory.eINSTANCE
                .createContainerStyle();
        containerRepresentation.setOwnedStyle(containerStyle);
        updateLabelStyle(containerStyle, diagramListEditPart);
        updateBorderedStyle(containerStyle, diagramListEditPart);
        Object model = diagramListEditPart.getModel();
        if (model instanceof org.eclipse.gmf.runtime.notation.Node) {
            org.eclipse.gmf.runtime.notation.Node node = (org.eclipse.gmf.runtime.notation.Node) model;
            if (node.getLayoutConstraint() instanceof Size) {
                Size size = (Size) node.getLayoutConstraint();
                if (size.getWidth() == -1 || size.getHeight() == -1) {
                    containerRepresentation.setAutoSized(true);
                }
            }
        }
        updateLayout(containerRepresentation, diagramListEditPart.getFigure());

        List<?> children = new ArrayList<Object>(diagramListEditPart.getChildren());
        Iterator<ResizableCompartmentEditPart> compart = Iterators
                .filter(diagramListEditPart.getChildren().iterator(), ResizableCompartmentEditPart.class);
        if (compart.hasNext()) {
            ResizableCompartmentEditPart compartmentEditPart = compart.next();
            children.addAll(compartmentEditPart.getChildren());
        }
        Iterable<IAbstractDiagramNodeEditPart> filter = Iterables.filter(children,
                IAbstractDiagramNodeEditPart.class);
        for (IAbstractDiagramNodeEditPart childEditPart : filter) {
            EObject targetSemanticElement = childEditPart.resolveTargetSemanticElement();
            if (targetSemanticElement instanceof Node && childEditPart instanceof IDiagramNodeEditPart) {
                Node subNode = (Node) targetSemanticElement;
                IDiagramNodeEditPart childNodeEditPart = (IDiagramNodeEditPart) childEditPart;
                NodeRepresentation nodeRepresentation = getMigrationNodeRepresentation(childNodeEditPart);
                subNode.getNodeRepresentations().add(nodeRepresentation);
            } else if (targetSemanticElement instanceof Bordered) {
                Bordered subBordered = (Bordered) targetSemanticElement;
                BorderedRepresentation borderedRepresentation = getMigrationBorderedRepresentation(childEditPart);
                subBordered.getBorderedRepresentations().add(borderedRepresentation);
            } else if (targetSemanticElement instanceof Container) {
                Container subContainer = (Container) targetSemanticElement;
                ContainerRepresentation subContainerRepresentation = null;
                if (childEditPart instanceof IDiagramContainerEditPart) {
                    subContainerRepresentation = getMigrationContainerRepresentation(
                            (IDiagramContainerEditPart) childEditPart);
                } else if (childEditPart instanceof IDiagramListEditPart) {
                    subContainerRepresentation = getMigrationContainerRepresentation(
                            (IDiagramListEditPart) childEditPart);
                }
                if (subContainerRepresentation != null) {
                    subContainer.getContainerRepresentations().add(subContainerRepresentation);
                }
            }
        }

        return containerRepresentation;
    }

    @SuppressWarnings("unchecked")
    private ContainerRepresentation getMigrationContainerRepresentation(
            IDiagramContainerEditPart diagramContainerEditPart) {
        ContainerRepresentation containerRepresentation = MigrationmodelerFactory.eINSTANCE
                .createContainerRepresentation();
        containerRepresentation.setMappingId(getMappingId(diagramContainerEditPart));
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.ContainerStyle containerStyle = MigrationmodelerFactory.eINSTANCE
                .createContainerStyle();
        containerRepresentation.setOwnedStyle(containerStyle);
        updateLabelStyle(containerStyle, diagramContainerEditPart);
        updateBorderedStyle(containerStyle, diagramContainerEditPart);
        Object model = diagramContainerEditPart.getModel();
        if (model instanceof org.eclipse.gmf.runtime.notation.Node) {
            org.eclipse.gmf.runtime.notation.Node node = (org.eclipse.gmf.runtime.notation.Node) model;
            if (node.getLayoutConstraint() instanceof Size) {
                Size size = (Size) node.getLayoutConstraint();
                if (size.getWidth() == -1 || size.getHeight() == -1) {
                    containerRepresentation.setAutoSized(true);
                }
            }
        }
        updateLayout(containerRepresentation, diagramContainerEditPart.getFigure());
        List<?> children = new ArrayList<Object>(diagramContainerEditPart.getChildren());
        Iterator<ResizableCompartmentEditPart> compart = Iterators
                .filter(diagramContainerEditPart.getChildren().iterator(), ResizableCompartmentEditPart.class);
        if (compart.hasNext()) {
            ResizableCompartmentEditPart compartmentEditPart = compart.next();
            children.addAll(compartmentEditPart.getChildren());
        }
        Iterable<IAbstractDiagramNodeEditPart> filter = Iterables.filter(children,
                IAbstractDiagramNodeEditPart.class);
        for (IAbstractDiagramNodeEditPart childEditPart : filter) {
            EObject targetSemanticElement = childEditPart.resolveTargetSemanticElement();
            if (targetSemanticElement instanceof Node && childEditPart instanceof IDiagramNodeEditPart) {
                Node subNode = (Node) targetSemanticElement;
                IDiagramNodeEditPart childNodeEditPart = (IDiagramNodeEditPart) childEditPart;
                NodeRepresentation nodeRepresentation = getMigrationNodeRepresentation(childNodeEditPart);
                subNode.getNodeRepresentations().add(nodeRepresentation);
            } else if (targetSemanticElement instanceof Bordered) {
                Bordered subBordered = (Bordered) targetSemanticElement;
                BorderedRepresentation borderedRepresentation = getMigrationBorderedRepresentation(childEditPart);
                subBordered.getBorderedRepresentations().add(borderedRepresentation);
            } else if (targetSemanticElement instanceof Container) {
                Container subContainer = (Container) targetSemanticElement;
                ContainerRepresentation subContainerRepresentation = null;
                if (childEditPart instanceof IDiagramContainerEditPart) {
                    subContainerRepresentation = getMigrationContainerRepresentation(
                            (IDiagramContainerEditPart) childEditPart);
                } else if (childEditPart instanceof IDiagramListEditPart) {
                    subContainerRepresentation = getMigrationContainerRepresentation(
                            (IDiagramListEditPart) childEditPart);
                }
                if (subContainerRepresentation != null) {
                    subContainer.getContainerRepresentations().add(subContainerRepresentation);
                }
            }
        }
        return containerRepresentation;
    }

    private BorderedRepresentation getMigrationBorderedRepresentation(
            IAbstractDiagramNodeEditPart borderedEditPart) {
        BorderedRepresentation borderedRepresentation = MigrationmodelerFactory.eINSTANCE
                .createBorderedRepresentation();
        borderedRepresentation.setMappingId(getMappingId(borderedEditPart));
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.NodeStyle nodeStyle = MigrationmodelerFactory.eINSTANCE
                .createNodeStyle();
        borderedRepresentation.setOwnedStyle(nodeStyle);
        updateNodeStyle(nodeStyle, borderedEditPart);
        updateLayout(borderedRepresentation, borderedEditPart.getFigure());
        return borderedRepresentation;
    }

    private NodeRepresentation getMigrationNodeRepresentation(IDiagramNodeEditPart diagramNodeEditPart) {
        NodeRepresentation nodeRepresentation = MigrationmodelerFactory.eINSTANCE.createNodeRepresentation();
        nodeRepresentation.setMappingId(getMappingId(diagramNodeEditPart));
        IFigure figure = diagramNodeEditPart.getFigure();

        nodeRepresentation.setDisplayed(true);
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.NodeStyle nodeStyle = MigrationmodelerFactory.eINSTANCE
                .createNodeStyle();
        nodeRepresentation.setOwnedStyle(nodeStyle);

        updateNodeStyle(nodeStyle, diagramNodeEditPart);
        updateLayout(nodeRepresentation, figure);

        return nodeRepresentation;
    }

    private EdgeRepresentation getMigrationEdgeRepresentation(
            AbstractDiagramEdgeEditPart abstractDiagramEdgeEditPart) {
        EdgeRepresentation edgeRepresentation = MigrationmodelerFactory.eINSTANCE.createEdgeRepresentation();
        edgeRepresentation.setMappingId(getMappingId(abstractDiagramEdgeEditPart));
        edgeRepresentation.setDisplayed(true);
        DEdge dEdge = (DEdge) abstractDiagramEdgeEditPart.resolveDiagramElement();
        Connection connectionFigure = abstractDiagramEdgeEditPart.getConnectionFigure();
        PointList points = abstractDiagramEdgeEditPart.getConnectionFigure().getPoints();
        if (points != null) {
            for (int i = 0; i < points.size(); i++) {
                Point point = points.getPoint(i);
                org.eclipse.sirius.tests.sample.migration.migrationmodeler.Point migrationPoint = MigrationmodelerFactory.eINSTANCE
                        .createPoint();
                migrationPoint.setX(point.x);
                migrationPoint.setY(point.y);
                edgeRepresentation.getBendpoints().add(migrationPoint);
            }
        }
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.EdgeStyle edgeStyle = MigrationmodelerFactory.eINSTANCE
                .createEdgeStyle();
        edgeRepresentation.setOwnedStyle(edgeStyle);

        RoutingStyle routingStyle = getRoutingStyle(connectionFigure);
        if (routingStyle != null) {
            edgeStyle.setRoutingStyle(routingStyle);
        }
        Color foregroundColor = connectionFigure.getForegroundColor();
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.Color color = MigrationmodelerFactory.eINSTANCE
                .createColor();
        color.setRed(foregroundColor.getRed());
        color.setGreen(foregroundColor.getGreen());
        color.setBlue(foregroundColor.getBlue());
        edgeStyle.setColor(color);
        DEdgeBeginNameEditPart beginDEdgeNameEditPart = getDEdgeBeginNameEditPart(abstractDiagramEdgeEditPart);
        if (beginDEdgeNameEditPart != null && dEdge.getOwnedStyle().getBeginLabelStyle() != null) {
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.BasicLabelStyle migrationBeginLabelStyle = getMigrationBasicLabelStyle(
                    dEdge.getOwnedStyle().getBeginLabelStyle(), beginDEdgeNameEditPart);
            edgeStyle.setBeginLabelStyle(migrationBeginLabelStyle);
        }
        DEdgeNameEditPart centerDEdgeNameEditPart = getDEdgeCenterNameEditPart(abstractDiagramEdgeEditPart);
        if (centerDEdgeNameEditPart != null && dEdge.getOwnedStyle().getCenterLabelStyle() != null) {
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.BasicLabelStyle migrationCenterLabelStyle = getMigrationBasicLabelStyle(
                    dEdge.getOwnedStyle().getCenterLabelStyle(), centerDEdgeNameEditPart);
            edgeStyle.setCenterLabelStyle(migrationCenterLabelStyle);
        }
        DEdgeEndNameEditPart endDEdgeNameEditPart = getDEdgeEndNameEditPart(abstractDiagramEdgeEditPart);
        if (endDEdgeNameEditPart != null && dEdge.getOwnedStyle().getEndLabelStyle() != null) {
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.BasicLabelStyle migrationEndLabelStyle = getMigrationBasicLabelStyle(
                    dEdge.getOwnedStyle().getEndLabelStyle(), endDEdgeNameEditPart);
            edgeStyle.setEndLabelStyle(migrationEndLabelStyle);
        }
        return edgeRepresentation;
    }

    private RoutingStyle getRoutingStyle(Connection connectionFigure) {
        RoutingStyle routingStyle = null;
        ConnectionRouter connectionRouter = connectionFigure.getConnectionRouter();
        if (connectionRouter instanceof RectilinearRouter) {
            routingStyle = RoutingStyle.MANHATTAN;
        } else if (connectionRouter instanceof FanRouter) {
            routingStyle = RoutingStyle.STRAIGHT;
        } else if (connectionRouter instanceof DForestRouter) {
            routingStyle = RoutingStyle.TREE;
        }
        return routingStyle;
    }

    private String getMappingId(IDiagramElementEditPart diagramListEditPart) {
        String mappingId = null;
        RepresentationElementMapping mapping = diagramListEditPart.resolveDiagramElement().getMapping();
        XMLResource xmlResource = (XMLResource) mapping.eResource();
        mappingId = xmlResource.getURIFragment(mapping);
        return mappingId;
    }

    private void updateNodeStyle(org.eclipse.sirius.tests.sample.migration.migrationmodeler.NodeStyle nodeStyle,
            IDiagramElementEditPart abstractGraphicalEditPart) {
        Iterator<DNodeNameEditPart> dNodeNameEditParts = Iterators
                .filter(abstractGraphicalEditPart.getChildren().iterator(), DNodeNameEditPart.class);
        if (dNodeNameEditParts.hasNext()) {
            DNodeNameEditPart dNodeNameEditPart = dNodeNameEditParts.next();
            if (dNodeNameEditPart.getFigure().isVisible()) {
                nodeStyle.setLabelPosition(LabelPosition.BORDER);
            } else {
                nodeStyle.setLabelPosition(LabelPosition.NODE);
            }
        }
        updateLabelStyle(nodeStyle, abstractGraphicalEditPart);
        updateBorderedStyle(nodeStyle, abstractGraphicalEditPart);
    }

    private void updateLabelStyle(org.eclipse.sirius.tests.sample.migration.migrationmodeler.LabelStyle labelStyle,
            IDiagramElementEditPart abstractGraphicalEditPart) {
        if (abstractGraphicalEditPart.getFigure() instanceof SiriusWrapLabel) {
            SiriusWrapLabel viewpointWrapLabel = (SiriusWrapLabel) abstractGraphicalEditPart.getFigure();
            LabelAlignment labelAlignment = null;
            switch (viewpointWrapLabel.getLabelAlignment2()) {
            case PositionConstants.CENTER:
                labelAlignment = LabelAlignment.CENTER;
                break;
            case PositionConstants.LEFT:
                labelAlignment = LabelAlignment.LEFT;
                break;
            case PositionConstants.RIGHT:
                labelAlignment = LabelAlignment.RIGHT;
                break;
            default:
                labelAlignment = LabelAlignment.CENTER;
                break;
            }
            labelStyle.setLabelAlignment(labelAlignment);
        }
        Iterator<org.eclipse.sirius.viewpoint.BasicLabelStyle> filter = Iterators.filter(
                abstractGraphicalEditPart.resolveDiagramElement().eAllContents(),
                org.eclipse.sirius.viewpoint.BasicLabelStyle.class);
        if (filter.hasNext()) {
            org.eclipse.sirius.viewpoint.BasicLabelStyle onlyElement = filter.next();
            updateBasicLabelStyle(labelStyle, onlyElement, (AbstractGraphicalEditPart) abstractGraphicalEditPart);
        }
    }

    private void updateBorderedStyle(
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.BorderedStyle borderedStyle,
            IDiagramElementEditPart abstractGraphicalEditPart) {
        IFigure figure = abstractGraphicalEditPart.getFigure();
        int borderSize = 0;
        Color borderColor = null;
        if (figure.getBorder() instanceof LineBorder) {
            LineBorder lineBorder = (LineBorder) figure.getBorder();
            borderSize = lineBorder.getWidth();
            borderColor = lineBorder.getColor();
        }
        borderedStyle.setBorderSize(borderSize);
        if (borderColor != null) {
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.Color color = MigrationmodelerFactory.eINSTANCE
                    .createColor();
            color.setRed(borderColor.getRed());
            color.setGreen(borderColor.getGreen());
            color.setBlue(borderColor.getBlue());
            borderedStyle.setBorderColor(color);
        }
    }

    private void updateLayout(AbstractRepresentation abstractRepresentation, IFigure figure) {
        Layout layout = MigrationmodelerFactory.eINSTANCE.createLayout();
        abstractRepresentation.setLayout(layout);
        Rectangle bounds = figure.getBounds();
        layout.setX(bounds.x);
        layout.setY(bounds.y);
        layout.setWidth(bounds.width);
        layout.setHeight(bounds.height);
    }

    private org.eclipse.sirius.tests.sample.migration.migrationmodeler.BasicLabelStyle getMigrationBasicLabelStyle(
            org.eclipse.sirius.viewpoint.BasicLabelStyle viewpointBasicLabelStyle,
            AbstractDEdgeNameEditPart abstractDEdgeNameEditPart) {
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.BasicLabelStyle migrationBeginLabelStyle = MigrationmodelerFactory.eINSTANCE
                .createBasicLabelStyle();
        updateBasicLabelStyle(migrationBeginLabelStyle, viewpointBasicLabelStyle, abstractDEdgeNameEditPart);
        return migrationBeginLabelStyle;
    }

    private void updateBasicLabelStyle(BasicLabelStyle migrationBeginLabelStyle,
            org.eclipse.sirius.viewpoint.BasicLabelStyle viewpointBasicLabelStyle,
            AbstractGraphicalEditPart abstractGraphicalEditPart) {
        IFigure figure = abstractGraphicalEditPart.getFigure();
        Font font = figure.getFont();
        FontData fontData = font.getFontData()[0];
        int fontHeight = fontData.getHeight();
        migrationBeginLabelStyle.setLabelSize(fontHeight);
        boolean isBold = (fontData.getStyle() & SWT.BOLD) != 0;
        boolean isItalic = (fontData.getStyle() & SWT.ITALIC) != 0;
        if (isBold && isItalic) {
            migrationBeginLabelStyle.setLabelFormat(FontFormat.BOLD_ITALIC);
        } else if (isBold) {
            migrationBeginLabelStyle.setLabelFormat(FontFormat.BOLD);
        } else if (isItalic) {
            migrationBeginLabelStyle.setLabelFormat(FontFormat.ITALIC);
        } else {
            migrationBeginLabelStyle.setLabelFormat(FontFormat.NORMAL);
        }
        Color labelForegroundColor = figure.getForegroundColor();
        org.eclipse.sirius.tests.sample.migration.migrationmodeler.Color migrationLabelForegroundColor = MigrationmodelerFactory.eINSTANCE
                .createColor();
        migrationLabelForegroundColor.setRed(labelForegroundColor.getRed());
        migrationLabelForegroundColor.setGreen(labelForegroundColor.getGreen());
        migrationLabelForegroundColor.setBlue(labelForegroundColor.getBlue());
        migrationBeginLabelStyle.setLabelColor(migrationLabelForegroundColor);
        AbstractDiagramNameEditPart abstractDiagramNameEditPart = getAbstractDiagramNameEditPart(
                abstractGraphicalEditPart);
        if (abstractDiagramNameEditPart != null) {
            SiriusWrapLabel viewpointWrapLabel = (SiriusWrapLabel) abstractDiagramNameEditPart.getFigure();
            Image icon = viewpointWrapLabel.getIcon();
            migrationBeginLabelStyle.setShowIcon(icon != null);
            if (icon == null) {
                migrationBeginLabelStyle.setIconPath(viewpointBasicLabelStyle.getIconPath());
            } else {
                migrationBeginLabelStyle
                        .setIconPath(getIconPath(viewpointBasicLabelStyle, abstractDiagramNameEditPart));
            }
        }
    }

    private AbstractDiagramNameEditPart getAbstractDiagramNameEditPart(
            AbstractGraphicalEditPart abstractGraphicalEditPart) {
        AbstractDiagramNameEditPart abstractDiagramNameEditPart = null;
        if (abstractGraphicalEditPart instanceof AbstractDiagramNameEditPart) {
            abstractDiagramNameEditPart = (AbstractDiagramNameEditPart) abstractGraphicalEditPart;
        } else {
            for (Object obj : abstractGraphicalEditPart.getChildren()) {
                if (obj instanceof AbstractDiagramNameEditPart) {
                    abstractDiagramNameEditPart = (AbstractDiagramNameEditPart) obj;
                    break;
                }
            }
        }
        return abstractDiagramNameEditPart;
    }

    private String getIconPath(org.eclipse.sirius.viewpoint.BasicLabelStyle viewpointBasicLabelStyle,
            AbstractDiagramNameEditPart abstractDiagramNameEditPart) {
        String iconPath = "";
        String modelIconPath = viewpointBasicLabelStyle.getIconPath();
        IFigure figure = abstractDiagramNameEditPart.getFigure();
        if (figure instanceof SiriusWrapLabel) {
            SiriusWrapLabel viewpointWrapLabel = (SiriusWrapLabel) figure;
            Image icon = viewpointWrapLabel.getIcon();
            if (modelIconPath != null && modelIconPath.length() > 0) {
                File imageFile = FileProvider.getDefault().getFile(new Path(modelIconPath));
                if (imageFile != null) {
                    try {
                        ImageDescriptor imageDescriptor = DiagramUIPlugin.Implementation
                                .findImageDescriptor(imageFile.toURI().toURL());
                        if (imageDescriptor == null) {
                            imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
                        }
                        Image image = DiagramUIPlugin.getPlugin().getImage(imageDescriptor);
                        if (areEqualImages(image, icon)) {
                            iconPath = modelIconPath;
                        }
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
        return iconPath;
    }

    /**
     * Test the equality of two {@link Image} according to their
     * {@link Image#getImageData()#data}.
     * 
     * @param image1
     *            first {@link Image}
     * @param image2
     *            second {@link Image}
     * @return true if <code>image1</code> is equal to <code>image2</code>
     */
    public static boolean areEqualImages(Image image1, Image image2) {
        byte[] expectedData = image1.getImageData().data;
        byte[] currentData = image2.getImageData().data;
        boolean areSameImages = expectedData.length == currentData.length;
        if (areSameImages) {
            for (int i = 0; i < expectedData.length && areSameImages; i++) {
                areSameImages = areSameImages && expectedData[i] == currentData[i];
            }
        }
        return areSameImages;
    }

    private DEdgeBeginNameEditPart getDEdgeBeginNameEditPart(
            AbstractDiagramEdgeEditPart abstractDiagramEdgeEditPart) {
        DEdgeBeginNameEditPart dEdgeBeginNameEditPart = null;
        for (Object child : abstractDiagramEdgeEditPart.getChildren()) {
            if (child instanceof DEdgeBeginNameEditPart) {
                dEdgeBeginNameEditPart = (DEdgeBeginNameEditPart) child;
                break;
            }
        }
        return dEdgeBeginNameEditPart;
    }

    private DEdgeNameEditPart getDEdgeCenterNameEditPart(AbstractDiagramEdgeEditPart abstractDiagramEdgeEditPart) {
        DEdgeNameEditPart dEdgeCenterNameEditPart = null;
        for (Object child : abstractDiagramEdgeEditPart.getChildren()) {
            if (child instanceof DEdgeNameEditPart) {
                dEdgeCenterNameEditPart = (DEdgeNameEditPart) child;
                break;
            }
        }
        return dEdgeCenterNameEditPart;
    }

    private DEdgeEndNameEditPart getDEdgeEndNameEditPart(AbstractDiagramEdgeEditPart abstractDiagramEdgeEditPart) {
        DEdgeEndNameEditPart dEdgeEndNameEditPart = null;
        for (Object child : abstractDiagramEdgeEditPart.getChildren()) {
            if (child instanceof DEdgeEndNameEditPart) {
                dEdgeEndNameEditPart = (DEdgeEndNameEditPart) child;
                break;
            }
        }
        return dEdgeEndNameEditPart;
    }

    private void setLayers(DSemanticDiagram dSemanticDiagram, Diagram migrationDiagram) {
        List<Layer> activatedLayers = dSemanticDiagram.getActivatedLayers();

        // Remove layers from migration diagram
        migrationDiagram.getLayers().clear();

        for (Layer layer : activatedLayers) {
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.Layer migrationLayer = MigrationmodelerFactory.eINSTANCE
                    .createLayer();
            migrationLayer.setId(layer.getName());
            migrationLayer.setActivated(true);
            migrationDiagram.getLayers().add(migrationLayer);
        }

        List<Layer> allLayers = new ArrayList<Layer>(dSemanticDiagram.getDescription().getAllLayers());
        allLayers.removeAll(activatedLayers);

        for (Layer layer : allLayers) {
            org.eclipse.sirius.tests.sample.migration.migrationmodeler.Layer migrationLayer = MigrationmodelerFactory.eINSTANCE
                    .createLayer();
            migrationLayer.setId(layer.getName());
            migrationLayer.setActivated(false);
            migrationDiagram.getLayers().add(migrationLayer);
        }
    }

    private void setFilters(DSemanticDiagram dSemanticDiagram, Diagram migrationDiagram) {
        List<FilterDescription> activatedFilters = dSemanticDiagram.getActivatedFilters();

        // Remove filters from migration diagram
        migrationDiagram.getFilters().clear();

        for (FilterDescription filterDescription : activatedFilters) {
            Filter migrationFilter = MigrationmodelerFactory.eINSTANCE.createFilter();
            migrationFilter.setId(filterDescription.getName());
            migrationFilter.setActivated(true);
            migrationDiagram.getFilters().add(migrationFilter);
        }

        List<FilterDescription> allFilters = new ArrayList<FilterDescription>(
                dSemanticDiagram.getDescription().getFilters());
        allFilters.removeAll(activatedFilters);

        for (FilterDescription filterDescription : allFilters) {
            Filter migrationFilter = MigrationmodelerFactory.eINSTANCE.createFilter();
            migrationFilter.setId(filterDescription.getName());
            migrationFilter.setActivated(false);
            migrationDiagram.getFilters().add(migrationFilter);
        }
    }

    private boolean isPresentInDiagram(AbstractRepresentation element, DSemanticDiagram diagram) {
        for (DDiagramElement diagramElement : diagram.getDiagramElements()) {
            if (diagramElement.getTarget().equals(element)) {
                return true;
            }
        }
        return false;
    }

}