blob: 8bc00d7727c5cfd36d97b6a64206d42faf8c0a8d [file] [log] [blame]
/**
* Copyright (c) 2010-2012 ISBAN S.L
*
* 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:
* Ruben De Dios (ISBAN S.L)
* Andrez Alvarez Mattos (ISBAN S.L)
*/
package org.eclipse.gmf.tooling.simplemap.migrate.ui;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gmf.gmfgraph.Canvas;
import org.eclipse.gmf.gmfgraph.Connection;
import org.eclipse.gmf.gmfgraph.DiagramLabel;
import org.eclipse.gmf.gmfgraph.Node;
import org.eclipse.gmf.mappings.ChildReference;
import org.eclipse.gmf.mappings.CompartmentMapping;
import org.eclipse.gmf.mappings.LinkMapping;
import org.eclipse.gmf.mappings.Mapping;
import org.eclipse.gmf.mappings.NodeMapping;
import org.eclipse.gmf.mappings.TopNodeReference;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.tooldef.Palette;
import org.eclipse.gmf.tooling.simplemap.diagram.edit.parts.SimpleMappingEditPart;
import org.eclipse.gmf.tooling.simplemap.diagram.part.SimplemapDiagramEditorPlugin;
import org.eclipse.gmf.tooling.simplemap.diagram.part.SimplemapDiagramEditorUtil;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleChildNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleChildReference;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleCompartment;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleLabelNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleLinkMapping;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleMapping;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleNodeReference;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleParentNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleSubNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleTopNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimplemappingsFactory;
/**
* @generated
*/
public class SimplemapMigrationEditorUtil extends SimplemapDiagramEditorUtil {
private SimpleMapping simpleMapping;
/**
* This method should be called within a workspace modify operation since it creates resources.
* @generated
*/
public Resource createDiagram(URI diagramURI, IProgressMonitor progressMonitor, final Mapping myMapping, final Canvas myCanvas, final Palette myPalette) {
TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
progressMonitor.beginTask(org.eclipse.gmf.tooling.simplemap.diagram.part.Messages.SimplemapDiagramEditorUtil_CreateDiagramProgressTask, 3);
final Resource diagramResource = editingDomain.getResourceSet().createResource(diagramURI);
final String diagramName = diagramURI.lastSegment();
AbstractTransactionalCommand command = new AbstractTransactionalCommand(editingDomain,
org.eclipse.gmf.tooling.simplemap.diagram.part.Messages.SimplemapDiagramEditorUtil_CreateDiagramCommandLabel, Collections.EMPTY_LIST) {
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
SimpleMapping model = createInitialModel(myMapping, myCanvas, myPalette);
attachModelToResource(model, diagramResource);
Diagram diagram = ViewService.createDiagram(model, SimpleMappingEditPart.MODEL_ID, SimplemapDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
if (diagram != null) {
diagramResource.getContents().add(diagram);
diagram.setName(diagramName);
diagram.setElement(model);
}
try {
diagramResource.save(org.eclipse.gmf.tooling.simplemap.diagram.part.SimpleMapEditorDiagramEditorUtil.getSaveOptions());
} catch (IOException e) {
SimplemapDiagramEditorPlugin.getInstance().logError("Unable to store model and diagram resources", e); //$NON-NLS-1$
}
return CommandResult.newOKCommandResult();
}
};
try {
OperationHistoryFactory.getOperationHistory().execute(command, new SubProgressMonitor(progressMonitor, 1), null);
} catch (ExecutionException e) {
SimplemapDiagramEditorPlugin.getInstance().logError("Unable to create model and diagram", e); //$NON-NLS-1$
}
setCharset(WorkspaceSynchronizer.getFile(diagramResource));
return diagramResource;
}
/**
* Create a new instance of domain element associated with canvas.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public SimpleMapping createInitialModel(Mapping myMapping, Canvas myCanvas, Palette myPalette) {
simpleMapping = SimplemappingsFactory.eINSTANCE.createSimpleMapping();
simpleMapping.setMapping(myMapping);
simpleMapping.setCanvas(myCanvas);
simpleMapping.setPalette(myPalette);
simpleMapping.getChildren().addAll(createNodes(myMapping));
//createNodeLinkRelations();
return simpleMapping;
}
private List<SimpleChildNode> createNodes(Mapping myMapping) {
List<SimpleChildNode> children = new ArrayList<SimpleChildNode>();
for (TopNodeReference topNodeRef : myMapping.getNodes())
children.add(createTopNode(topNodeRef));
for (LinkMapping linkMapping : myMapping.getLinks())
children.add(createLinkMappingNode(linkMapping));
return children;
}
private SimpleTopNode createTopNode(TopNodeReference topNodeReference) {
SimpleTopNode topNode = SimplemappingsFactory.eINSTANCE.createSimpleTopNode();
topNode.setContainmentFeature(topNodeReference.getContainmentFeature());
NodeMapping nodeMapping = topNodeReference.getChild();
if (nodeMapping != null) {
topNode.setDomainMetaElement(nodeMapping.getDomainMetaElement());
for (ChildReference childReference : nodeMapping.getChildren())
createChild(topNode, childReference);
}
topNode.setNodeReference(topNodeReference);
return topNode;
}
private SimpleLinkMapping createLinkMappingNode(LinkMapping linkMapping) {
SimpleLinkMapping simpleLinkMapping = SimplemappingsFactory.eINSTANCE.createSimpleLinkMapping();
simpleLinkMapping.setLinkMapping(linkMapping);
Connection diagramLink = linkMapping.getDiagramLink();
if (diagramLink != null)
simpleLinkMapping.setName(diagramLink.getName());
return simpleLinkMapping;
}
private void createChild(SimpleParentNode parentNode, ChildReference childReference) {
SimpleParentNode parent = parentNode;
CompartmentMapping compartmentMapping = childReference.getCompartment();
if (compartmentMapping != null) {
SimpleCompartment simpleCompartment = findSimpleCompartment(parentNode, compartmentMapping);
if (simpleCompartment == null) {
simpleCompartment = SimplemappingsFactory.eINSTANCE.createSimpleCompartment();
simpleCompartment.setCompartmentMapping(compartmentMapping);
simpleCompartment.setName(compartmentMapping.getCompartment().getName());
parentNode.getChildren().add(simpleCompartment);
}
parent = simpleCompartment;
}
NodeMapping referencedChild = childReference.getReferencedChild();
NodeMapping nodeMapping = childReference.getChild();
SimpleNodeReference newChild = null;
if (referencedChild != null) {
newChild = SimplemappingsFactory.eINSTANCE.createSimpleChildReference();
parent.getChildren().add((SimpleChildReference) newChild);
}//It's a sub label:
else if (nodeMapping != null && nodeMapping.getDiagramNode() instanceof DiagramLabel) {
newChild = SimplemappingsFactory.eINSTANCE.createSimpleLabelNode();
parent.getChildren().add((SimpleLabelNode) newChild);
} else if (nodeMapping != null && nodeMapping.getDiagramNode() instanceof Node) {
newChild = SimplemappingsFactory.eINSTANCE.createSimpleSubNode();
parent.getChildren().add((SimpleSubNode) newChild);
for (ChildReference childReference2 : nodeMapping.getChildren())
createChild((SimpleSubNode) newChild, childReference2);
}
if (newChild != null) {
newChild.setContainmentFeature(childReference.getContainmentFeature());
newChild.setNodeReference(childReference);
}
if (newChild instanceof SimpleNode && nodeMapping != null)
((SimpleNode) newChild).setDomainMetaElement(nodeMapping.getDomainMetaElement());
}
private SimpleCompartment findSimpleCompartment(SimpleParentNode parentNode, CompartmentMapping compartmentMapping) {
for (SimpleChildNode child : parentNode.getChildren())
if (child instanceof SimpleCompartment && ((SimpleCompartment) child).getCompartmentMapping() == compartmentMapping)
return (SimpleCompartment) child;
return null;
}
/**
* Store model element in the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void attachModelToResource(SimpleMapping model, Resource resource) {
resource.getContents().add(model);
}
}