/** * 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); } }