/*******************************************************************************
* 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.extended.flow;
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.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.util.EMFHelper;
import org.eclipse.emf.eef.codegen.extended.initializer.EEFEditorModelInitializer;
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;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*
*/
public class GenerateEEFEditorModels extends Step {
private EEFEditorModelInitializer eefeditorModelInitializer;
private Object modelURI;
private Object editGenProject;
private Object genmodelURI;
private WorkflowVariable eefgenModelVar;
private Object modelsFolder;
/**
* @param name of the step
*/
public GenerateEEFEditorModels(String name, Object modelURI, Object editGenProject, Object genmodelURI, Object modelsFolder) {
super(name);
this.modelURI = modelURI;
this.editGenProject = editGenProject;
this.genmodelURI = genmodelURI;
this.modelsFolder = modelsFolder;
}
/**
* {@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) {
eefeditorModelInitializer = new EEFEditorModelInitializer();
initializeEEFModels(getModelsFolder(), getGenModelURI());
EEFGenModel eefgenModel = generatedEEFGen(getModelURI(), getModelsFolder());
((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.", e);
} catch (CoreException e) {
return new Status(IStatus.ERROR, EEFCodegenPlugin.PLUGIN_ID, "An error occured during EEF models initialization.", e);
}
}
public Object getEEFGenModel() {
if (eefgenModelVar == null) {
eefgenModelVar = new WorkflowVariable(eefgenmodelVarName());
}
return eefgenModelVar;
}
private final String eefgenmodelVarName() {
return "GEN_EEF_EDITOR_MODEL_" + name + "_EEFGENMODEL";
}
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 IFolder getModelsFolder() {
if (modelsFolder instanceof IFolder) {
return (IFolder) modelsFolder;
} else if (modelsFolder instanceof WorkflowVariable) {
return (IFolder) ((WorkflowVariable)modelsFolder).getValue();
} else {
return null;
}
}
private void initializeEEFModels(IFolder modelsFolder, URI genmodelURI) throws IOException, CoreException {
NullProgressMonitor monitor = new NullProgressMonitor();
eefeditorModelInitializer.initialize(genmodelURI, modelsFolder);
modelsFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
}
private EEFGenModel generatedEEFGen(URI modelURI, IFolder modelsFolder) throws IOException {
EEFGenModel eefgenModel = null;
URI eefgenURI = GenmodelHelper.computeEditorEEFGenModelURI(modelsFolder, modelURI);
EObject extractedEEFGenModel = EMFHelper.load(eefgenURI, resourceSet);
if (extractedEEFGenModel instanceof EEFGenModel) {
eefgenModel = (EEFGenModel)extractedEEFGenModel;
}
return eefgenModel;
}
}