blob: 682b585cc6f32bcd3e46926e185a3dbdd244d72c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.ui.internal.wizards;
import java.text.MessageFormat;
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.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.pde.api.tools.internal.ApiDescriptionManager;
import org.eclipse.pde.api.tools.internal.builder.BuildState;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.util.Util;
import org.eclipse.pde.api.tools.ui.internal.IApiToolsConstants;
/**
* Provides a {@link Change} for updating the nature, etc of a project
*
* @since 1.0.0
*/
public class ProjectUpdateChange extends Change {
private IProject fProject = null;
/**
* Constructor
*
* @param project the project to configure
*/
public ProjectUpdateChange(IProject project) {
fProject = project;
}
@Override
public Object getModifiedElement() {
return fProject;
}
@Override
public String getName() {
return WizardMessages.ProjectUpdateChange_add_nature_and_builder;
}
@Override
public void initializeValidationData(IProgressMonitor pm) {
}
@Override
public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, OperationCanceledException {
if (fProject.isAccessible()) {
return RefactoringStatus.create(Status.OK_STATUS);
}
return RefactoringStatus.createErrorStatus(MessageFormat.format(WizardMessages.ProjectUpdateChange_project_not_accessible, fProject.getName()));
}
@Override
public Change perform(IProgressMonitor pm) throws CoreException {
SubMonitor localmonitor = SubMonitor.convert(pm);
localmonitor.beginTask(IApiToolsConstants.EMPTY_STRING, 1);
localmonitor.setTaskName(WizardMessages.ProjectUpdateChange_adding_nature_and_builder);
IProjectDescription description = this.fProject.getDescription();
String[] prevNatures = description.getNatureIds();
String[] newNatures = new String[prevNatures.length + 1];
System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
newNatures[prevNatures.length] = ApiPlugin.NATURE_ID;
description.setNatureIds(newNatures);
this.fProject.setDescription(description, localmonitor);
IJavaProject javaProject = JavaCore.create(this.fProject);
// make sure we get rid of the previous api description file
ApiDescriptionManager.getManager().clean(javaProject, true, true);
// we want a full build of the converted project next time a build is
// triggered
if (ResourcesPlugin.getWorkspace().isAutoBuilding()) {
Util.getBuildJob(new IProject[] { this.fProject }).schedule();
} else {
/*
* If autobuild is off, clear the last build state to force a full
* build of this project on the next build.
*/
BuildState.setLastBuiltState(this.fProject, null);
}
localmonitor.split(1);
return null;
}
}