| /********************************************************************* |
| * Copyright (c) 2009, 2012 SpringSource, a division of VMware, Inc. |
| * |
| * This program and the accompanying materials are made |
| * available under the terms of the Eclipse Public License 2.0 |
| * which is available at https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| **********************************************************************/ |
| |
| package org.eclipse.virgo.ide.ui.wizards; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.emf.ecore.xmi.XMLResource; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.jst.common.project.facet.JavaProjectFacetCreationDataModelProvider; |
| import org.eclipse.pde.internal.ui.wizards.IProjectProvider; |
| import org.eclipse.pde.internal.ui.wizards.plugin.AbstractFieldData; |
| import org.eclipse.pde.internal.ui.wizards.plugin.PluginFieldData; |
| import org.eclipse.ui.INewWizard; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.IWorkingSet; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.actions.WorkspaceModifyOperation; |
| import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; |
| import org.eclipse.ui.dialogs.WizardNewProjectReferencePage; |
| import org.eclipse.ui.part.FileEditorInput; |
| import org.eclipse.ui.part.ISetSelectionTarget; |
| import org.eclipse.ui.statushandlers.StatusManager; |
| import org.eclipse.virgo.ide.eclipse.wizards.AbstractNewParProjectWizard; |
| import org.eclipse.virgo.ide.facet.core.FacetCorePlugin; |
| import org.eclipse.virgo.ide.manifest.core.BundleManifestUtils; |
| import org.eclipse.virgo.ide.par.Bundle; |
| import org.eclipse.virgo.ide.par.Par; |
| import org.eclipse.virgo.ide.par.ParFactory; |
| import org.eclipse.virgo.ide.par.ParPackage; |
| import org.eclipse.virgo.ide.ui.ServerIdeUiPlugin; |
| import org.eclipse.virgo.ide.ui.editors.ParManifestEditor; |
| import org.eclipse.virgo.ide.ui.editors.ParUtils; |
| import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties; |
| import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory; |
| import org.eclipse.wst.common.frameworks.datamodel.IDataModel; |
| import org.eclipse.wst.common.project.facet.core.IFacetedProject; |
| import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; |
| import org.eclipse.wst.common.project.facet.core.runtime.IRuntime; |
| |
| /** |
| * @author Christian Dupuis |
| * @author Leo Dos Santos |
| */ |
| public class NewParProjectWizard extends AbstractNewParProjectWizard implements INewWizard { |
| |
| private static final String PAR_FILE_NAME = ".settings/org.eclipse.virgo.ide.runtime.core.par.xml"; //$NON-NLS-1$ |
| |
| private static final String ENCODING_UTF8 = "UTF-8"; //$NON-NLS-1$ |
| |
| private WizardNewProjectCreationPage mainPage; |
| |
| private NewParInformationPage bundlePage; |
| |
| private WizardNewProjectReferencePage referencePage; |
| |
| private IProjectProvider projectProvider; |
| |
| private final AbstractFieldData bundleData; |
| |
| private final IDataModel model; |
| |
| private final String title = Messages.NewParProjectWizard_title; |
| |
| protected ParPackage parPackage = ParPackage.eINSTANCE; |
| |
| protected ParFactory parFactory = this.parPackage.getParFactory(); |
| |
| public NewParProjectWizard() { |
| super(); |
| setWindowTitle(this.title); |
| setNeedsProgressMonitor(true); |
| this.bundleData = new PluginFieldData(); |
| this.model = DataModelFactory.createDataModel(new JavaProjectFacetCreationDataModelProvider()); |
| } |
| |
| private void addFacetsToProject(final IProject project) { |
| WorkspaceModifyOperation oper = new WorkspaceModifyOperation() { |
| |
| @Override |
| protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { |
| IFacetedProject fProject = ProjectFacetsManager.create(project.getProject(), true, monitor); |
| |
| // WST 3.0 only |
| // fProject.createWorkingCopy().addProjectFacet( |
| // ProjectFacetsManager.getProjectFacet("jst.java"). |
| // getLatestVersion()); |
| // fProject.createWorkingCopy().addProjectFacet( |
| // ProjectFacetsManager.getProjectFacet(FacetCorePlugin. |
| // BUNDLE_FACET_ID).getLatestVersion()); |
| |
| fProject.installProjectFacet(ProjectFacetsManager.getProjectFacet(FacetCorePlugin.PAR_FACET_ID).getDefaultVersion(), null, monitor); |
| IRuntime runtime = (IRuntime) NewParProjectWizard.this.model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME); |
| if (runtime != null && runtime.supports(ProjectFacetsManager.getProjectFacet(FacetCorePlugin.PAR_FACET_ID))) { |
| fProject.setTargetedRuntimes(Collections.singleton(runtime), monitor); |
| } |
| } |
| }; |
| |
| try { |
| getContainer().run(true, true, oper); |
| } catch (InvocationTargetException e) { |
| StatusManager.getManager().handle(new Status(IStatus.ERROR, ServerIdeUiPlugin.PLUGIN_ID, "Exception while adding project facets.", e)); //$NON-NLS-1$ |
| } catch (InterruptedException e) { |
| StatusManager.getManager().handle( |
| new Status(IStatus.WARNING, ServerIdeUiPlugin.PLUGIN_ID, "Interruption while adding project facets.", e)); //$NON-NLS-1$ |
| } |
| } |
| |
| @Override |
| public void addPages() { |
| this.mainPage = new NewParProjectSettingsPage("basicNewProjectPage", getSelection()); //$NON-NLS-1$ |
| setMainPage(this.mainPage); |
| addPage(this.mainPage); |
| |
| this.projectProvider = new IProjectProvider() { |
| |
| public IPath getLocationPath() { |
| return getProject().getLocation(); |
| } |
| |
| public IProject getProject() { |
| return NewParProjectWizard.this.mainPage.getProjectHandle(); |
| } |
| |
| public String getProjectName() { |
| return NewParProjectWizard.this.mainPage.getProjectName(); |
| } |
| }; |
| |
| this.bundlePage = new NewParInformationPage(this.title, this.projectProvider, this.bundleData, this.model); |
| addPage(this.bundlePage); |
| |
| // only add page if there are already projects in the workspace |
| if (ResourcesPlugin.getWorkspace().getRoot().getProjects().length > 0) { |
| this.referencePage = new NewParProjectReferencePage("basicReferenceProjectPage"); //$NON-NLS-1$ |
| addPage(this.referencePage); |
| } |
| } |
| |
| private IFile associateProjectsToPar(IProject[] references, final IFile parFile) { |
| // Add the initial model object to the contents. |
| // |
| final Par par = this.parFactory.createPar(); |
| for (IProject workspaceProject : references) { |
| Bundle bundle = this.parFactory.createBundle(); |
| bundle.setSymbolicName(ParUtils.getSymbolicName(workspaceProject)); |
| par.getBundle().add(bundle); |
| } |
| |
| try { |
| WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { |
| |
| @Override |
| protected void execute(IProgressMonitor progressMonitor) { |
| try { |
| // Create a resource set |
| // |
| ResourceSet resourceSet = new ResourceSetImpl(); |
| |
| // Get the URI of the model file. |
| // |
| org.eclipse.emf.common.util.URI fileURI = org.eclipse.emf.common.util.URI.createPlatformResourceURI( |
| parFile.getFullPath().toString(), true); |
| |
| // Create a resource for this file. |
| // |
| Resource resource = resourceSet.createResource(fileURI); |
| resource.getContents().add(par); |
| |
| // Save the contents of the resource to the file |
| // system. |
| // |
| Map<Object, Object> options = new HashMap<Object, Object>(); |
| options.put(XMLResource.OPTION_ENCODING, ENCODING_UTF8); |
| resource.save(options); |
| } catch (Exception exception) { |
| ServerIdeUiPlugin.getDefault().log(exception); |
| } finally { |
| progressMonitor.done(); |
| } |
| } |
| }; |
| getContainer().run(false, false, operation); |
| return parFile; |
| } catch (Exception exception) { |
| ServerIdeUiPlugin.getDefault().log(exception); |
| return null; |
| } |
| } |
| |
| @Override |
| public boolean canFinish() { |
| IWizardPage page = getContainer().getCurrentPage(); |
| return super.canFinish() && page != getMainPage(); |
| } |
| |
| @Override |
| public boolean performFinish() { |
| createNewProject(); |
| if (getNewProject() == null) { |
| return false; |
| } |
| |
| this.bundlePage.performPageFinish(); |
| addFacetsToProject(getNewProject()); |
| writeBundleData(getNewProject()); |
| |
| if (this.referencePage != null) { |
| IProject[] references = this.referencePage.getReferencedProjects(); |
| associateProjectsToPar(references, getNewProject().getFile(PAR_FILE_NAME)); |
| } |
| |
| IWorkingSet[] workingSets = this.mainPage.getSelectedWorkingSets(); |
| if (workingSets.length > 0) { |
| getWorkbench().getWorkingSetManager().addToWorkingSets(getNewProject(), workingSets); |
| } |
| |
| IFile manifestFile = (IFile) getNewProject().findMember("META-INF/MANIFEST.MF"); //$NON-NLS-1$ |
| if (manifestFile != null) { |
| // Select the new file resource in the current view. |
| // |
| IWorkbenchWindow workbenchWindow = getWorkbench().getActiveWorkbenchWindow(); |
| IWorkbenchPage page = workbenchWindow.getActivePage(); |
| final IWorkbenchPart activePart = page.getActivePart(); |
| if (activePart instanceof ISetSelectionTarget) { |
| final ISelection targetSelection = new StructuredSelection(manifestFile); |
| getShell().getDisplay().asyncExec(new Runnable() { |
| |
| public void run() { |
| ((ISetSelectionTarget) activePart).selectReveal(targetSelection); |
| } |
| }); |
| } |
| |
| // Open an editor on the new file. |
| // |
| try { |
| page.openEditor(new FileEditorInput(manifestFile), ParManifestEditor.ID_EDITOR); |
| } catch (PartInitException exception) { |
| MessageDialog.openError(workbenchWindow.getShell(), "Error opening editor", exception.getMessage()); //$NON-NLS-1$ |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| private void writeBundleData(final IProject project) { |
| WorkspaceModifyOperation oper = new WorkspaceModifyOperation() { |
| |
| @Override |
| protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { |
| BundleManifestUtils.createNewParManifest(project, NewParProjectWizard.this.bundleData.getId(), |
| NewParProjectWizard.this.bundleData.getVersion(), NewParProjectWizard.this.bundleData.getName(), |
| NewParProjectWizard.this.bundleData.getProvider()); |
| project.refreshLocal(IResource.DEPTH_INFINITE, monitor); |
| } |
| }; |
| |
| try { |
| getContainer().run(true, true, oper); |
| } catch (InvocationTargetException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (InterruptedException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } |
| |
| @Override |
| protected void initializeDefaultPageImageDescriptor() { |
| setDefaultPageImageDescriptor(ServerIdeUiPlugin.getImageDescriptor("full/wizban/wizban-par.png")); //$NON-NLS-1$ |
| } |
| |
| } |