blob: d4dbbc071d8b6ea741819a9953f27485ab79eab0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ui.refactoring;
import com.ibm.icu.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.pde.core.IBaseModel;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.ICoreConstants;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.util.ModelModification;
import org.eclipse.pde.internal.ui.util.PDEModelUtility;
public class RenameExtensionPointProcessor extends RefactoringProcessor {
RefactoringInfo fInfo;
public RenameExtensionPointProcessor(RefactoringInfo info) {
fInfo = info;
}
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);
return status;
}
public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException, OperationCanceledException {
return null;
}
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
CompositeChange change = new CompositeChange(MessageFormat.format(PDEUIMessages.RenameExtensionPointProcessor_changeTitle, new String[] {fInfo.getCurrentValue(), fInfo.getNewValue()}));
pm.beginTask("", 2); //$NON-NLS-1$
changeExtensionPoint(change, new SubProgressMonitor(pm, 1));
if (fInfo.isUpdateReferences())
findReferences(change, new SubProgressMonitor(pm, 1));
return change;
}
public Object[] getElements() {
return new Object[] {fInfo.getSelection()};
}
public String getIdentifier() {
return getClass().getName();
}
public String getProcessorName() {
return PDEUIMessages.RenameExtensionPointProcessor_processorName;
}
public boolean isApplicable() throws CoreException {
return true;
}
public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants) throws CoreException {
return new RefactoringParticipant[0];
}
protected void changeExtensionPoint(CompositeChange compositeChange, IProgressMonitor monitor) {
IFile file = getModificationFile(fInfo.getBase());
if (file != null)
compositeChange.addAll(PDEModelUtility.changesForModelModication(getExtensionPointModification(file), monitor));
}
private void findReferences(CompositeChange compositeChange, IProgressMonitor monitor) {
String pointId = getId();
IPluginModelBase[] bases = PDECore.getDefault().getExtensionsRegistry().findExtensionPlugins(pointId, true);
monitor.beginTask("", bases.length); //$NON-NLS-1$
for (int i = 0; i < bases.length; i++) {
IFile file = getModificationFile(bases[i]);
if (file != null)
compositeChange.addAll(PDEModelUtility.changesForModelModication(getExtensionModification(file), new SubProgressMonitor(monitor, 1)));
}
}
private String getId() {
String currentValue = fInfo.getCurrentValue();
if (currentValue.indexOf('.') > 0)
return currentValue;
IPluginModelBase base = PluginRegistry.findModel(fInfo.getBase().getUnderlyingResource().getProject());
return (base == null) ? currentValue : base.getPluginBase().getId() + "." + currentValue; //$NON-NLS-1$
}
private String getNewId() {
String newValue = fInfo.getNewValue();
if (newValue.indexOf('.') > 0)
return newValue;
IPluginModelBase base = PluginRegistry.findModel(fInfo.getBase().getUnderlyingResource().getProject());
return (base == null) ? newValue : base.getPluginBase().getId() + "." + newValue; //$NON-NLS-1$
}
private IFile getModificationFile(IPluginModelBase base) {
IResource res = base.getUnderlyingResource();
if (res != null) {
IProject proj = res.getProject();
IFile file = proj.getFile(ICoreConstants.PLUGIN_FILENAME_DESCRIPTOR);
if (file.exists())
return file;
}
return null;
}
protected ModelModification getExtensionPointModification(IFile file) {
return new ModelModification(file) {
protected void modifyModel(IBaseModel model, IProgressMonitor monitor) throws CoreException {
if (!(model instanceof IPluginModelBase))
return;
IPluginModelBase modelBase = (IPluginModelBase) model;
IPluginBase base = modelBase.getPluginBase();
IPluginExtensionPoint[] points = base.getExtensionPoints();
for (int i = 0; i < points.length; i++) {
if (points[i].getId().equals(fInfo.getCurrentValue())) {
points[i].setId(fInfo.getNewValue());
// TODO Update schema
// String schema = points[i].getSchema();
}
}
}
};
}
protected ModelModification getExtensionModification(IFile file) {
return new ModelModification(file) {
protected void modifyModel(IBaseModel model, IProgressMonitor monitor) throws CoreException {
if (!(model instanceof IPluginModelBase))
return;
IPluginModelBase modelBase = (IPluginModelBase) model;
IPluginBase base = modelBase.getPluginBase();
IPluginExtension[] extensions = base.getExtensions();
String oldValue = getId();
for (int i = 0; i < extensions.length; i++)
if (extensions[i].getPoint().equals(oldValue))
extensions[i].setPoint(getNewId());
}
};
}
}