/*******************************************************************************
* Copyright (c) 2009 SpringSource, a divison of VMware, Inc.
* 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:
* SpringSource, a division of VMware, Inc. - initial API and implementation
*******************************************************************************/
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;
import org.springframework.ide.eclipse.core.SpringCore;
import org.springframework.ide.eclipse.core.SpringCoreUtils;
/**
* @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";
private static final String ENCODING_UTF8 = "UTF-8";
private WizardNewProjectCreationPage mainPage;
private NewParInformationPage bundlePage;
private WizardNewProjectReferencePage referencePage;
private IProjectProvider projectProvider;
private final AbstractFieldData bundleData;
private final IDataModel model;
private final String title = "New PAR Project";
protected ParPackage parPackage = ParPackage.eINSTANCE;
protected ParFactory parFactory = parPackage.getParFactory();
public NewParProjectWizard() {
super();
setWindowTitle(title);
setNeedsProgressMonitor(true);
bundleData = new PluginFieldData();
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 {
SpringCoreUtils.addProjectNature(project.getProject(), SpringCore.NATURE_ID, monitor);
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) 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));
}
catch (InterruptedException e) {
StatusManager.getManager().handle(
new Status(IStatus.WARNING, ServerIdeUiPlugin.PLUGIN_ID,
"Interruption while adding project facets.", e));
}
}
@Override
public void addPages() {
mainPage = new NewParProjectSettingsPage("basicNewProjectPage", getSelection());
setMainPage(mainPage);
addPage(mainPage);
projectProvider = new IProjectProvider() {
public IPath getLocationPath() {
return getProject().getLocation();
}
public IProject getProject() {
return mainPage.getProjectHandle();
}
public String getProjectName() {
return mainPage.getProjectName();
}
};
bundlePage = new NewParInformationPage(title, projectProvider, bundleData, model);
addPage(bundlePage);
// only add page if there are already projects in the workspace
if (ResourcesPlugin.getWorkspace().getRoot().getProjects().length > 0) {
referencePage = new NewParProjectReferencePage("basicReferenceProjectPage");
addPage(referencePage);
}
}
private IFile associateProjectsToPar(IProject[] references, final IFile parFile) {
// Add the initial model object to the contents.
//
final Par par = parFactory.createPar();
for (IProject workspaceProject : references) {
Bundle bundle = 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;
}
bundlePage.performPageFinish();
addFacetsToProject(getNewProject());
writeBundleData(getNewProject());
if (referencePage != null) {
IProject[] references = referencePage.getReferencedProjects();
associateProjectsToPar(references, getNewProject().getFile(PAR_FILE_NAME));
}
IWorkingSet[] workingSets = mainPage.getSelectedWorkingSets();
if (workingSets.length > 0) {
getWorkbench().getWorkingSetManager().addToWorkingSets(getNewProject(), workingSets);
}
IFile manifestFile = (IFile) getNewProject().findMember("META-INF/MANIFEST.MF");
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());
}
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, bundleData.getId(), bundleData.getVersion(),
bundleData.getName(), 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"));
}
}