/******************************************************************************* * Copyright (c) 2008, 2012 Obeo. * 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.emf.eef.codegen.flow.impl; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.common.util.BasicMonitor; import org.eclipse.emf.common.util.Monitor; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.eef.codegen.EEFCodegenPlugin; import org.eclipse.emf.eef.codegen.core.util.EMFHelper; import org.eclipse.emf.eef.codegen.flow.Step; import org.eclipse.emf.eef.codegen.flow.util.GenmodelHelper; import org.eclipse.emf.eef.codegen.flow.var.WorkflowVariable; import org.eclipse.emf.importer.ModelImporter; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> * */ public class InitializeGenModel extends Step { /** * GenModel variable */ private WorkflowVariable genmodelVar; /** * GenModel variable */ private WorkflowVariable genmodelURIVar; /** * GenModel Helper */ // private GenmodelHelper helper; private IFile modelFile; private IContainer targetFolder; private String genmodelFileName; /** * @param name of the step * @param modelURI Ecore model file * @param targetFolder Folder where to generate the GenModel */ public InitializeGenModel(String name, IFile modelFile, IContainer targetFolder, String genmodelFileName) { super(name); this.modelFile = modelFile; this.targetFolder = targetFolder; this.genmodelFileName = genmodelFileName; } /** * {@inheritDoc} * @see org.eclipse.emf.eef.codegen.flow.Step#execute(org.eclipse.core.runtime.IProgressMonitor) */ public IStatus execute(IProgressMonitor monitor) { try { BasicMonitor emfMonitor = new BasicMonitor(); ModelImporter importer = initializeConverter(genmodelFileName, emfMonitor); initializeGenModel(importer, emfMonitor); targetFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); URI genmodelURI = GenmodelHelper.computeGenmodelURI(targetFolder, genmodelFileName); ((WorkflowVariable)getGenModelURI()).setValue(genmodelURI); ((WorkflowVariable)genmodel()).setValue(EMFHelper.load(genmodelURI, resourceSet)); return Status.OK_STATUS; } catch (Exception e) { return new Status(IStatus.ERROR, EEFCodegenPlugin.PLUGIN_ID, "An error occured during genmodel initialization", e); } } private final String genmodelVarName() { return "INIT_GENMODEL_" + name + "_GENMODEL"; } private final String genmodelURIVarName() { return "INIT_GENMODEL_" + name + "_GENMODEL_URI"; } public Object genmodel() { if (genmodelVar == null) { genmodelVar = new WorkflowVariable(genmodelVarName()); getContext().add(genmodelVar); } return genmodelVar; } /** * @return the generated genmodel URI. */ public Object getGenModelURI() { if (genmodelURIVar == null) { genmodelURIVar = new WorkflowVariable(genmodelURIVarName()); } return genmodelURIVar; } private ModelImporter initializeConverter(String genmodelFileName, Monitor monitor) throws Exception { ModelImporter converter = new org.eclipse.emf.importer.ecore.EcoreImporter(); converter.setGenModelContainerPath(targetFolder.getFullPath()); converter.setGenModelFileName(genmodelFileName); converter.setModelFile(modelFile); converter.computeEPackages(monitor); converter.adjustEPackages(monitor); return converter; } protected void initializeGenModel(ModelImporter importer, Monitor monitor) throws Exception { importer.prepareGenModelAndEPackages(monitor); configureGenModel(importer.getGenModel()); importer.saveGenModelAndEPackages(monitor); } protected void configureGenModel(GenModel genModel) { } }