blob: df266846a6a6980e2f3e668269543f8d4df1397b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
* 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:
* Erwan Mahe (CEA LIST) erwan.mahe@cea.fr - Initial API and implementation
*******************************************************************************/
package org.eclipse.efm.modeling.ui.newproject;
import java.io.IOException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.core.resource.ModelsReader;
import org.eclipse.papyrus.infra.core.services.ExtensionServicesRegistry;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.eclipse.papyrus.infra.ui.extension.commands.IModelCreationCommand;
import org.eclipse.papyrus.uml.diagram.common.commands.CreateUMLModelCommand;
import org.eclipse.papyrus.uml.tools.model.UmlModel;
import org.eclipse.papyrus.uml.tools.model.UmlUtils;
import org.eclipse.papyrus.uml.tools.utils.PackageUtil;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Profile;
public class WizardNewFormalModelProject extends BasicNewProjectResourceWizard implements INewWizard {
private String WIZARD_NAME = "From Scratch EFM Project Wizard";
private String WIZARD_DESC = "This wizard creates a new Eclipse Formal Modeling Project.";
private WizardNewProjectCreationPage project_page;
private WizardNewFormalModelCreationPage model_page;
public WizardNewFormalModelProject() {
setWindowTitle("Eclipse Formal Modeling New Project");
}
public void addPages() {
project_page = new WizardNewProjectCreationPage(WIZARD_NAME);
project_page.setTitle(WIZARD_NAME);
project_page.setDescription(WIZARD_DESC + "\nPlease enter a project name.");
addPage(project_page);
model_page = new WizardNewFormalModelCreationPage();
addPage(model_page);
}
public boolean performFinish() {
//final ModelSet modelSet = new ModelSet();
final ModelSet modelSet = new ModelSet();//DiResourceSet();
create_project_and_papyrus_model(modelSet);
TransactionalEditingDomain editingDomain = modelSet.getTransactionalEditingDomain();
final UmlModel umlModel = UmlUtils.getUmlModel(modelSet);
RecordingCommand command = new RecordingCommand(editingDomain) {
public void doExecute() {
try {
EObject rootNode = umlModel.lookupRoot();
org.eclipse.uml2.uml.Package rootPackage = PackageUtil.getRootPackage((Element) rootNode);
rootPackage.setName(model_page.getRootNodeName());
modelSet.save(new NullProgressMonitor());
URI profileURI = URI.createURI("platform:/plugin/org.eclipse.efm.formalml/resources/profile/FormalML.profile.uml");
Profile EFM_profile = (Profile) PackageUtil.loadPackage(profileURI, rootPackage.eResource().getResourceSet());
rootPackage.applyProfile(EFM_profile);
modelSet.save(new NullProgressMonitor());
} catch (Exception e) {
e.printStackTrace();
System.err.print("================================="+ "\n");
System.err.print(e.toString());
System.err.print("================================="+ "\n");
}
}
};
editingDomain.getCommandStack().execute(command);
return true;
}
private void create_project_and_papyrus_model(ModelSet modelSet) {
IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(project_page.getProjectName());
IProject project = project_page.getProjectHandle();
try {
project.create(desc, new NullProgressMonitor());
project.open(new NullProgressMonitor());
} catch (CoreException e) {
e.printStackTrace();
System.err.print("=================================\n");
System.err.print(e.toString());
System.err.print("=================================\n");
}
String modelFilePath = project.getFullPath().toString() + "/" + model_page.getModelFileName();
URI modelPResURI = URI.createPlatformResourceURI(modelFilePath, true);
try {
createPapyrusModel(modelPResURI, modelSet);
} catch (ServiceException | IOException e) {
e.printStackTrace();
System.err.print("=================================\n");
System.err.print(e.toString());
System.err.print("=================================\n");
}
}
private void createPapyrusModel(URI modelPResURI, ModelSet modelSet) throws ServiceException, IOException {
ModelsReader reader = new ModelsReader(); //Standard ModelsReader for Di + UML + Notation
reader.readModel(modelSet);
modelSet.createModels(modelPResURI); //Use an EMF URI instead of an Eclipse IFile
ServicesRegistry registry = new ExtensionServicesRegistry(org.eclipse.papyrus.infra.core.Activator.PLUGIN_ID);
registry.startServicesByClassKeys(ModelSet.class);
IModelCreationCommand creationCommand = new CreateUMLModelCommand();
creationCommand.createModel(modelSet);
modelSet.save(new NullProgressMonitor());
}
}