/******************************************************************************* * 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 java.io.IOException; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.eef.EEFGen.EEFGenModel; import org.eclipse.emf.eef.codegen.EEFCodegenPlugin; import org.eclipse.emf.eef.codegen.core.initializer.PropertiesInitializer; import org.eclipse.emf.eef.codegen.core.util.EMFHelper; import org.eclipse.emf.eef.codegen.flow.Step; import org.eclipse.emf.eef.codegen.flow.var.WorkflowVariable; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> * */ public class GenerateEEFModels extends Step { private PropertiesInitializer propertiesInitializer; private Object modelURI; private Object editGenProject; private Object genmodelURI; private WorkflowVariable eefgenModelVar; private WorkflowVariable eefModelsFolderVar; private String modelsFolderPath; /** * @param name of the step */ public GenerateEEFModels(String name, Object modelURI, Object editGenProject, Object genmodelURI, String modelsFolderPath) { super(name); this.modelURI = modelURI; this.editGenProject = editGenProject; this.genmodelURI = genmodelURI; this.modelsFolderPath = modelsFolderPath; } /** * {@inheritDoc} * @see org.eclipse.emf.eef.codegen.flow.Step#execute(org.eclipse.core.runtime.IProgressMonitor) */ public IStatus execute(IProgressMonitor monitor) { try { IProject editProject = getEditProject(); if (editProject != null) { propertiesInitializer = new PropertiesInitializer(); IFolder modelsFolder = createEEFModelsFolder(editProject, monitor); initializeEEFModels(modelsFolder, getGenModelURI()); EEFGenModel eefgenModel = generatedEEFGen(getModelURI(), modelsFolder); ((WorkflowVariable)getEEFGenModel()).setValue(eefgenModel); return Status.OK_STATUS; } else { return new Status(IStatus.ERROR, EEFCodegenPlugin.PLUGIN_ID, "Unable to find edit project"); } } catch (IOException e) { return new Status(IStatus.ERROR, EEFCodegenPlugin.PLUGIN_ID, "An error occured during EEF models initialization."); } catch (CoreException e) { return new Status(IStatus.ERROR, EEFCodegenPlugin.PLUGIN_ID, "An error occured during EEF models initialization."); } } public Object getEEFGenModel() { if (eefgenModelVar == null) { eefgenModelVar = new WorkflowVariable(eefgenmodelVarName()); } return eefgenModelVar; } private final String eefgenmodelVarName() { return "GEN_EEF_MODELS_" + name + "_EEFGENMODEL"; } public Object getEEFModelsFolder() { if (eefModelsFolderVar == null) { eefModelsFolderVar = new WorkflowVariable(eefModelsFolderVarName()); } return eefModelsFolderVar; } private final String eefModelsFolderVarName() { return "GEN_EEF_MODELS_" + name + "_EEFMODELSFOLDER"; } private URI getModelURI() { if (modelURI instanceof URI) { return (URI) modelURI; } else if (modelURI instanceof WorkflowVariable) { return (URI) ((WorkflowVariable)modelURI).getValue(); } return null; } private URI getGenModelURI() { if (genmodelURI instanceof URI) { return (URI) genmodelURI; } else if (genmodelURI instanceof WorkflowVariable) { return (URI) ((WorkflowVariable)genmodelURI).getValue(); } return null; } private IProject getEditProject() { if (editGenProject instanceof IProject) { return (IProject) editGenProject; } else if (editGenProject instanceof WorkflowVariable) { return (IProject) ((WorkflowVariable)editGenProject).getValue(); } else { return null; } } private void initializeEEFModels(IFolder modelsFolder, URI genmodelURI) throws IOException, CoreException { NullProgressMonitor monitor = new NullProgressMonitor(); propertiesInitializer.initialize(genmodelURI, modelsFolder); modelsFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); } private EEFGenModel generatedEEFGen(URI modelURI, IFolder modelsFolder) throws IOException { String eefgenPath = modelsFolder.getFullPath().toString() + "/" + modelURI.trimFileExtension().appendFileExtension("eefgen").lastSegment(); EEFGenModel eefgenModel = null; URI eefgenURI = URI.createPlatformResourceURI(eefgenPath, true); EObject extractedEEFGenModel = EMFHelper.load(eefgenURI, resourceSet); if (extractedEEFGenModel instanceof EEFGenModel) { eefgenModel = (EEFGenModel)extractedEEFGenModel; } return eefgenModel; } private IFolder createEEFModelsFolder(IProject editProject, IProgressMonitor monitor) throws CoreException { IFolder modelsFolder = editProject.getFolder(new Path(modelsFolderPath)); if (!modelsFolder.exists()) { modelsFolder.create(true, true, monitor); editProject.refreshLocal(IResource.DEPTH_INFINITE, monitor); } ((WorkflowVariable)getEEFModelsFolder()).setValue(modelsFolder); return modelsFolder; } }