/* * Copyright (c) 2006, 2007 Borland Software Corporation * 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: * Borland Software Corporation - initial API and implementation */ package org.eclipse.gmf.internal.codegen.popup.actions; import java.io.IOException; import java.util.Collections; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.ContentHandler; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.gmf.internal.bridge.genmodel.DiagramRunTimeModelTransformer; import org.eclipse.gmf.internal.bridge.genmodel.DummyGenModel; import org.eclipse.gmf.internal.bridge.genmodel.RuntimeGenModelAccess; import org.eclipse.gmf.mappings.Mapping; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; public class CreateSpecificDiagramRunTimeModelAction implements IObjectActionDelegate { private IFile myMapFile; private IWorkbenchPart myPart; public void setActivePart(IAction action, IWorkbenchPart targetPart) { myPart = targetPart; } public void run(IAction action) { final ResourceSetImpl resSet = new ResourceSetImpl(); final Mapping m = (Mapping) resSet.getResource(getMapModelURI(), true).getContents().get(0); final String packName = myMapFile.getLocation().removeFileExtension().lastSegment(); DiagramRunTimeModelTransformer t = new DiagramRunTimeModelTransformer(packName, getMapModelURI().appendSegment("diagramrt").toString()); t.transform(m); EPackage drtModel = t.getResult(); Resource drtEcoreModelRes = resSet.createResource(getDestEcoreURI(), ContentHandler.UNSPECIFIED_CONTENT_TYPE); URI genModelURI = getDestGenModelURI(); Resource drtGenModelRes = Resource.Factory.Registry.INSTANCE.getFactory(genModelURI, ContentHandler.UNSPECIFIED_CONTENT_TYPE).createResource(genModelURI); resSet.getResources().add(drtGenModelRes); // Resource drtGenModelRes = // resSet.createResource(getDestGenModelURI()); drtEcoreModelRes.getContents().add(drtModel); drtGenModelRes.getContents().add(createGenModel(drtModel)); try { drtEcoreModelRes.save(Collections.EMPTY_MAP); drtGenModelRes.save(Collections.EMPTY_MAP); } catch (IOException ex) { ex.printStackTrace(); } } private URI getDestEcoreURI() { IPath p = myMapFile.getFullPath(); return URI.createPlatformResourceURI(p.removeLastSegments(1).append(p.removeFileExtension().lastSegment() + "-drt").addFileExtension("ecore").toString(), true); } private URI getDestGenModelURI() { IPath p = myMapFile.getFullPath(); return URI.createPlatformResourceURI(p.removeLastSegments(1).append(p.removeFileExtension().lastSegment() + "-drt").addFileExtension("genmodel").toString(), true); } public void selectionChanged(IAction action, ISelection selection) { myMapFile = (IFile) ((IStructuredSelection) selection).getFirstElement(); } private URI getMapModelURI() { return URI.createPlatformResourceURI(myMapFile.getFullPath().toString(), true); } protected Shell getShell() { return myPart.getSite().getShell(); } private GenModel createGenModel(EPackage model) { GenModel genModel = new DummyGenModel(model, null).create(); genModel.getForeignModel().add(model.eResource().getURI().toString()); genModel.getUsedGenPackages().add(getDiagramRunTimeGenPackage()); GenPackage genPackage = genModel.getGenPackages().get(0); genPackage.setPrefix(model.getName() + "DRT"); return genModel; } private GenPackage getDiagramRunTimeGenPackage() { RuntimeGenModelAccess runtimeAccess = new RuntimeGenModelAccess(); runtimeAccess.ensure(); return runtimeAccess.genPackage(); } }