/******************************************************************************* * 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.initializer; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.eef.codegen.core.initializer.AbstractPropertiesInitializer; import org.eclipse.emf.eef.codegen.core.util.EMFHelper; import org.eclipse.emf.eef.codegen.extended.flow.CleanEEFEditorSources; import org.eclipse.emf.eef.codegen.extended.flow.GenerateEEFEditorModels; import org.eclipse.emf.eef.codegen.extended.flow.OverrideEMFEditorCode; import org.eclipse.emf.eef.codegen.flow.ConditionalStep; import org.eclipse.emf.eef.codegen.flow.Workflow; import org.eclipse.emf.eef.codegen.flow.impl.AddDependency; import org.eclipse.emf.eef.codegen.flow.impl.GenerateEEFCode; import org.eclipse.emf.eef.codegen.flow.impl.GenerateEEFModels; import org.eclipse.emf.eef.codegen.flow.impl.GenerateEMFEditCode; import org.eclipse.emf.eef.codegen.flow.impl.GenerateEMFEditorCode; import org.eclipse.emf.eef.codegen.flow.impl.GenerateEMFModelCode; import org.eclipse.emf.eef.codegen.flow.impl.InitializeGenModel; import org.eclipse.emf.eef.codegen.flow.impl.MergePluginXML; import org.eclipse.emf.eef.codegen.flow.util.GenmodelHelper; import org.eclipse.emf.eef.codegen.flow.var.WorkflowVariable; import org.eclipse.emf.eef.runtime.EEFRuntimePlugin; import org.eclipse.emf.eef.runtime.ui.EEFExtendedRuntime; import org.eclipse.emf.eef.runtime.ui.utils.EditingUtils; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.actions.WorkspaceModifyOperation; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> */ public class EEFEditorInitializer extends AbstractPropertiesInitializer { private static final String CLEAN_EEF_EDITOR_SOURCE = "Clean EEF editor source"; private static final String WORKFLOW_NAME = "Generate EEF Editor"; private static final String GENERATING_THE_GENMODEL = "Generating the GenModel"; private static final String GENERATE_EMF_MODEL_CODE = "Generate EMF Model Code"; private static final String GENERATE_EMF_EDIT_CODE = "Generate EMF Edit Code"; private static final String GENERATE_EMF_EDITOR_CODE = "Generate EMF Editor Code"; private static final String GENERATE_EEF_MODELS = "Generate EEF models"; private static final String ADDING_EEF_RUNTIME_DEPENDENCY = "Adding EEF Runtime dependency"; private static final String GENERATE_EEF_CODE = "Generate EEF code"; private static final String MERGING_GENERATED_PLUGIN_XML_FILES = "Merging generated plugin.xml files"; private static final String GENERATE_EEF_EDITOR_MODELS = "Generate EEF Editor models"; private static final String ADDING_EEF_EXTENDED_RUNTIME_DEPENDENCY = "Adding EEF Extended Runtime dependency"; private static final String GENERATE_EEF_EDITOR_CODE = "Generate EEF Editor code"; private ResourceSet resourceSet; private IFile modelFile; private IWorkbenchPartSite activeSite; public EEFEditorInitializer(IFile selectedFile, IWorkbenchPartSite activeSite) { this.modelFile = selectedFile; this.activeSite = activeSite; } /** * {@inheritDoc] * @throws Exception * @see org.eclipse.emf.eef.codegen.core.initializer.IPropertiesInitializer#initialize(org.eclipse.emf.common.util.URI, org.eclipse.core.resources.IContainer) */ public void initialize(URI modelURI, IContainer targetFolder) throws Exception { resourceSet = new ResourceSetImpl(); registerResourceFactories(resourceSet); registerPackages(resourceSet); EObject model = EMFHelper.load(modelURI, resourceSet); if (model instanceof EPackage) { final Workflow workflow = new Workflow(WORKFLOW_NAME, activeSite.getShell()); workflow.setResourceSet(resourceSet); final GenmodelHelper helper = new GenmodelHelper(resourceSet, modelFile, targetFolder); CleanEEFEditorSources cleanEEFEditorSources = new CleanEEFEditorSources(CLEAN_EEF_EDITOR_SOURCE, modelFile, targetFolder); ConditionalStep conditon = new ConditionalStep(cleanEEFEditorSources) { @Override public boolean condition() { return helper.getGenModelFile().isAccessible(); } }; workflow.addStep(CLEAN_EEF_EDITOR_SOURCE, conditon); // Step 1 : Generate GenModel InitializeGenModel initializeGenModelStep = new InitializeGenModel(GENERATING_THE_GENMODEL, modelFile, targetFolder, helper.genmodelFileName()) { /** * {@inheritDoc} * * @see org.eclipse.emf.eef.codegen.flow.Step#validateExecution() */ public boolean validateExecution() { boolean genmodelExists = helper.getGenModelFile().exists(); if (genmodelExists) { try { ((WorkflowVariable)getGenModelURI()).setValue(helper.genmodelURI()); ((WorkflowVariable)genmodel()).setValue(EMFHelper.load(helper.genmodelURI(), resourceSet)); } catch (IOException e) { EEFExtendedRuntime.INSTANCE.log(e); return true; } } return !genmodelExists; } /** * {@inheritDoc] * @see org.eclipse.emf.eef.codegen.flow.impl.InitializeGenModel#configureGenModel(org.eclipse.emf.codegen.ecore.genmodel.GenModel) */ public void configureGenModel(GenModel genModel) { genModel.setModelDirectory(genModel.getModelDirectory() + "-gen"); genModel.setEditDirectory(genModel.getEditDirectory() + "-gen"); genModel.setEditorDirectory(genModel.getEditorDirectory() + "-gen"); } }; workflow.addStep(GENERATING_THE_GENMODEL, initializeGenModelStep); // Step 2 : Generate EMF Code GenerateEMFModelCode generateEMFModelCode = new GenerateEMFModelCode(GENERATE_EMF_MODEL_CODE, initializeGenModelStep.genmodel()); workflow.addStep(GENERATE_EMF_MODEL_CODE, generateEMFModelCode); GenerateEMFEditCode generateEMFEditCode = new GenerateEMFEditCode(GENERATE_EMF_EDIT_CODE, initializeGenModelStep.genmodel()); workflow.addStep(GENERATE_EMF_EDIT_CODE, generateEMFEditCode); GenerateEMFEditorCode generateEMFEditorCode = new GenerateEMFEditorCode(GENERATE_EMF_EDITOR_CODE, initializeGenModelStep.genmodel()); workflow.addStep(GENERATE_EMF_EDITOR_CODE, generateEMFEditorCode); // Step 3 : Generate EEF model GenerateEEFModels generateEEFModels = new GenerateEEFModels(GENERATE_EEF_MODELS, modelURI, generateEMFEditCode.genProject(), initializeGenModelStep.getGenModelURI(), helper.eefmodelsFolderPath()) { /** * {@inheritDoc} * * @see org.eclipse.emf.eef.codegen.flow.Step#validateExecution() */ public boolean validateExecution() { boolean modelsExist = helper.getEEFPropertiesComponentsModel().exists() && helper.getEEFPropertiesEEFGenModel().exists(); if (modelsExist) { try { ((WorkflowVariable)getEEFModelsFolder()).setValue(helper.getEEFModelsFolder()); ((WorkflowVariable)getEEFGenModel()).setValue(EMFHelper.load( GenmodelHelper.computePropertiesEEFGenModelURI( helper.getEEFModelsFolder(), helper.genmodelURI()), resourceSet)); } catch (IOException e) { EEFExtendedRuntime.INSTANCE.log(e); return true; } } return !modelsExist; } }; workflow.addStep(GENERATE_EEF_MODELS, generateEEFModels); // Step 4 : Add EEF Runtime dependency AddDependency addDependency = new AddDependency(ADDING_EEF_RUNTIME_DEPENDENCY, generateEMFEditCode.genProject(), EEFRuntimePlugin.PLUGIN_ID); workflow.addStep(ADDING_EEF_RUNTIME_DEPENDENCY, addDependency); GenerateEEFCode generateEEFCode = new GenerateEEFCode(GENERATE_EEF_CODE, generateEEFModels.getEEFGenModel()); // JDTImportsOrganisationCallback callback = new JDTImportsOrganisationCallback(activeSite); // generateEEFCode.addGenerationCallback(callback); workflow.addStep(GENERATE_EEF_CODE, generateEEFCode); // Step 6 : Adding Extension Point MergePluginXML mergePluginXML = new MergePluginXML(MERGING_GENERATED_PLUGIN_XML_FILES, generateEMFEditCode.genProject()); workflow.addStep(MERGING_GENERATED_PLUGIN_XML_FILES, mergePluginXML); final GenerateEEFEditorModels generateEEFEditorModels = new GenerateEEFEditorModels( GENERATE_EEF_EDITOR_MODELS, modelURI, generateEMFEditCode.genProject(), initializeGenModelStep.getGenModelURI(), generateEEFModels.getEEFModelsFolder()) { /** * {@inheritDoc} * * @see org.eclipse.emf.eef.codegen.flow.Step#validateExecution() */ public boolean validateExecution() { boolean modelsExist = helper.getEEFEditorComponentsModel().exists() && helper.getEEFEditorEEFGenModel().exists(); if (modelsExist) { try { ((WorkflowVariable)getEEFGenModel()).setValue(EMFHelper.load(GenmodelHelper .computeEditorEEFGenModelURI(helper.getEEFModelsFolder(), helper.genmodelURI()), resourceSet)); } catch (IOException e) { EEFExtendedRuntime.INSTANCE.log(e); return true; } } return !modelsExist; } }; workflow.addStep(GENERATE_EEF_EDITOR_MODELS, generateEEFEditorModels); AddDependency addExtendedRuntimeDependency = new AddDependency( ADDING_EEF_EXTENDED_RUNTIME_DEPENDENCY, generateEMFEditorCode.genProject(), EEFExtendedRuntime.PLUGIN_ID); workflow.addStep(ADDING_EEF_EXTENDED_RUNTIME_DEPENDENCY, addExtendedRuntimeDependency); OverrideEMFEditorCode generateEEFEditorCode = new OverrideEMFEditorCode(GENERATE_EEF_EDITOR_CODE, generateEEFEditorModels.getEEFGenModel()); workflow.addStep(GENERATE_EEF_EDITOR_CODE, generateEEFEditorCode); if (workflow.prepare()) { WorkspaceModifyOperation runnable = new WorkspaceModifyOperation() { public void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { workflow.execute(monitor); } }; new ProgressMonitorDialog(EditingUtils.getShell()).run(true, true, runnable); } } } }