/******************************************************************************* * 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.ecore.ui.launcher; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.emf.codegen.ecore.Generator; import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter; import org.eclipse.emf.common.util.BasicMonitor; import org.eclipse.emf.common.util.UniqueEList; import org.eclipse.emf.eef.codegen.ecore.EMFCodegenPlugin; import org.eclipse.emf.eef.codegen.ecore.main.GenModel; import org.eclipse.emf.eef.codegen.ecore.util.EEFGeneratorAdapter; import org.eclipse.emf.eef.codegen.flow.Step; import org.eclipse.emf.eef.codegen.flow.Workflow; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> */ public class GenerateEMFModelCodeAction extends GenerateEMFCodeAction { /** * {@inheritDoc} * * @see org.eclipse.emf.eef.codegen.ecore.ui.launcher.GenerateEMFCodeAction#initEMFGenFlow() */ protected Workflow initEMFGenFlow() { final Workflow flow = new Workflow("Generate EMF model code ", shell); for (final org.eclipse.emf.codegen.ecore.genmodel.GenModel emfGenModel : emfGenModels) { String s2 = "Generate EMF Model code for " + emfGenModel.eResource().getURI().toString(); flow.addStep(s2, new Step("EMF MODEL") { @Override public IStatus execute(IProgressMonitor monitor) { // create the model project IProject modelProject = extractProject(emfGenModel.getModelProjectDirectory()); if (modelProject == null) { return Status.OK_STATUS; } List<IProject> referencedProjects = new UniqueEList<IProject>(); if (!workspace.getRoot().exists(modelProject.getFullPath())) { // TODO Manage the case when the model project has been deleted from the workspace but is still present on disk ? modelProject = Generator.createEMFProject(new Path(emfGenModel.getModelDirectory()), modelProject .getLocation(), referencedProjects, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN), Generator.EMF_MODEL_PROJECT_STYLE | Generator.EMF_PLUGIN_PROJECT_STYLE); } else if (!modelProject.isAccessible()) { try { modelProject.open(monitor); } catch (CoreException e) { return new Status(IStatus.ERROR, EMFCodegenPlugin.PLUGIN_ID, e.getMessage(), e); } } // generate using acceleo List<String> args = new ArrayList<String>(); File modelDirectory = modelProject.getLocation().toFile(); try { GenModel generator = new GenModel(emfGenModel, modelDirectory, args); generator.doGenerate(BasicMonitor.toMonitor(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN))); } catch (IOException e) { return new Status(IStatus.ERROR, EMFCodegenPlugin.PLUGIN_ID, e.getMessage(), e); } return Status.OK_STATUS; } }); if (emfGenModel.isCodeFormatting()) { // TODO Ne rafraichir avant le formatage que si le folder demand� n'est pas accessible // FIXME IMPORTANT !!! Virer le double refresh, fait � l'arrache par LDE qui sait pas comment faire autrement // TODO D�terminer pourquoi il reste des diff�rences de formatage avec EMF // TODO D�terminer pourquoi quand on fait clic-droit -> Source -> format sur le code g�n�r�, le code est modifi� // (cas o� le projet vient d'�tre cr�� par exemple) String s1b = "Refreshing workspace " + emfGenModel.eResource().getURI().toString(); flow.addStep(s1b, new Step("REFRESH") { @Override public IStatus execute(IProgressMonitor monitor) { // refresh model project IProject modelProject = extractProject(emfGenModel.getModelProjectDirectory()); if (modelProject == null) { return Status.OK_STATUS; } try { if (!modelProject.isOpen()) { modelProject.open(monitor); } modelProject.refreshLocal(IResource.DEPTH_INFINITE, monitor); } catch (CoreException e) { return new Status(IStatus.ERROR, EMFCodegenPlugin.PLUGIN_ID, e.getMessage(), e); } return Status.OK_STATUS; } }); String s2prime = "Formatting generated files"; flow.addStep(s2prime, new Step(s2prime) { @Override public IStatus execute(IProgressMonitor monitor) { EEFGeneratorAdapter eefGen = new EEFGeneratorAdapter(); eefGen.generate(emfGenModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, BasicMonitor.toMonitor(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN))); return Status.OK_STATUS; } }); } String s3 = "Refreshing workspace " + emfGenModel.eResource().getURI().toString(); flow.addStep(s3, new Step("REFRESH") { @Override public IStatus execute(IProgressMonitor monitor) { // refresh model project IProject modelProject = extractProject(emfGenModel.getModelProjectDirectory()); if (modelProject == null) { return Status.OK_STATUS; } try { if (!modelProject.isOpen()) { modelProject.open(monitor); } modelProject.refreshLocal(IResource.DEPTH_INFINITE, monitor); } catch (CoreException e) { return new Status(IStatus.ERROR, EMFCodegenPlugin.PLUGIN_ID, e.getMessage(), e); } return Status.OK_STATUS; } }); } return flow; } }