blob: 911429bb75b6f61f69284f67b6a1de967f904a24 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 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
* Johannes Ahlers <Johannes.Ahlers@gmx.de> - bug 477677
*******************************************************************************/
package org.eclipse.pde.internal.ui.refactoring;
import java.text.MessageFormat;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.ltk.core.refactoring.*;
import org.eclipse.ltk.core.refactoring.participants.*;
import org.eclipse.ltk.core.refactoring.resource.RenameResourceDescriptor;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.project.PDEProject;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.osgi.framework.Constants;
public class RenamePluginProcessor extends RefactoringProcessor {
RefactoringPluginInfo fInfo;
public RenamePluginProcessor(RefactoringInfo info) {
fInfo = (RefactoringPluginInfo) info;
}
@Override
public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException, OperationCanceledException {
RefactoringStatus status = new RefactoringStatus();
IResource res = fInfo.getBase().getUnderlyingResource();
if (res == null)
status.addFatalError(PDEUIMessages.RenamePluginProcessor_externalBundleError);
else if (!PDEProject.getManifest(res.getProject()).exists())
status.addFatalError(PDEUIMessages.RenamePluginProcessor_noManifestError);
if (fInfo.isRenameProject()) {
String newName = fInfo.getNewValue();
IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(newName);
// if destination exists and it is not the same project we are currently trying to rename, show error message
if (newProject.exists() && !(res.getProject().equals(newProject)))
status.addFatalError(MessageFormat.format(PDEUIMessages.RenameProjectChange_destinationExists, newName));
}
return status;
}
@Override
public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException, OperationCanceledException {
return null;
}
@Override
public Object[] getElements() {
return new Object[] {fInfo.getBase()};
}
@Override
public String getIdentifier() {
return getClass().getName();
}
@Override
public String getProcessorName() {
return PDEUIMessages.RenamePluginProcessor_processorName;
}
@Override
public boolean isApplicable() throws CoreException {
return true;
}
@Override
public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants) throws CoreException {
if (fInfo.isRenameProject()) {
// filter out PDE's container rename refactor participant. We will already update the Manifest, so we don't need to run our participant
IParticipantDescriptorFilter filter = new IParticipantDescriptorFilter() {
static final String PDE_CONTAINER_RENAME_PARTICIPANT = "org.eclipse.pde.ui.manifestFolderRenameParticipant"; //$NON-NLS-1$
@Override
public boolean select(IConfigurationElement element, RefactoringStatus status) {
if (PDE_CONTAINER_RENAME_PARTICIPANT.equals(element.getAttribute("id"))) //$NON-NLS-1$
return false;
return true;
}
};
IProject project = fInfo.getBase().getUnderlyingResource().getProject();
return ParticipantManager.loadRenameParticipants(status, this, project, new RenameArguments(fInfo.getNewValue(), true), filter, getAffectedNatures(project), sharedParticipants);
}
return new RefactoringParticipant[0];
}
private String[] getAffectedNatures(IProject project) throws CoreException {
// NOTE: JDT searches each dependent project for additional natures
return project.getDescription().getNatureIds();
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
CompositeChange change = new CompositeChange(MessageFormat.format(PDEUIMessages.RenamePluginProcessor_changeTitle, fInfo.getCurrentValue(), fInfo.getNewValue()));
SubMonitor subMonitor = SubMonitor.convert(pm, getTotalWork());
// update manifest with new Id
CreateHeaderChangeOperation op = new CreateHeaderChangeOperation(fInfo.getBase(), Constants.BUNDLE_SYMBOLICNAME, fInfo.getCurrentValue(), fInfo.getNewValue());
op.run(subMonitor.split(1));
change.add(op.getChange());
if (fInfo.isRenameProject()) {
change.add(createProjectChange(subMonitor.split( 1)));
}
if (fInfo.isUpdateReferences())
change.addAll(createReferenceChanges(subMonitor.split(2)));
return change;
}
private int getTotalWork() {
int total = 1;
if (fInfo.isRenameProject())
total += 1;
if (fInfo.isUpdateReferences())
total += 2;
return total;
}
protected Change createProjectChange(IProgressMonitor monitor) {
RenameResourceDescriptor descriptor = new RenameResourceDescriptor();
IProject project = fInfo.getBase().getUnderlyingResource().getProject();
String newName = fInfo.getNewValue();
// if project's name is already the same as the destination, then we don't have to do anything to rename project
if (project.getName().equals(newName))
return null;
descriptor.setDescription(MessageFormat.format(PDEUIMessages.RenamePluginProcessor_renameProjectDesc, project.getName(), newName));
descriptor.setComment(""); //$NON-NLS-1$
descriptor.setFlags(RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE | RefactoringDescriptor.BREAKING_CHANGE);
descriptor.setResourcePath(project.getFullPath());
descriptor.setNewName(fInfo.getNewValue());
monitor.done();
return new RenameProjectChange(descriptor, project, fInfo.getNewValue(), null);
}
protected Change[] createReferenceChanges(IProgressMonitor monitor) throws CoreException {
IPluginModelBase currentBase = fInfo.getBase();
BundleDescription desc = currentBase.getBundleDescription();
if (desc == null) {
IPluginModelBase savedBase = PluginRegistry.findModel(currentBase.getUnderlyingResource().getProject());
desc = (savedBase != null) ? savedBase.getBundleDescription() : null;
}
if (desc != null) {
FindReferenceOperation op = new FindReferenceOperation(desc, fInfo.getNewValue());
op.run(monitor);
return op.getChanges();
}
return new Change[0];
}
}