blob: 07e4dda3ab17760c86a68aa1ca2d6bf92766edee [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 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.ltk.core.refactoring;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.ltk.core.refactoring.history.IRefactoringHistoryService;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
import org.eclipse.ltk.internal.core.refactoring.RefactoringCoreMessages;
import org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryService;
/**
* Operation that, when run, executes a series of refactoring sequentially.
* Refactorings are executed using {@link PerformRefactoringOperation}.
* <p>
* The operation should be executed via the run method offered by
* <code>IWorkspace</code> to achieve proper delta batching.
* </p>
* <p>
* Note: this class is not intended to be instantiated or extended outside of
* the refactoring framework.
* </p>
*
* @see org.eclipse.core.resources.IWorkspace
* @see PerformRefactoringOperation
* @see RefactoringHistory
* @see RefactoringHistoryService
*
* @since 3.2
*/
public class PerformRefactoringHistoryOperation implements IWorkspaceRunnable {
/** The status of the execution */
private RefactoringStatus fExecutionStatus= new RefactoringStatus();
/** The refactoring history */
private final RefactoringHistory fRefactoringHistory;
/**
* Creates a new perform refactoring history operation.
*
* @param history
* the refactoring history
*/
public PerformRefactoringHistoryOperation(final RefactoringHistory history) {
Assert.isNotNull(history);
fRefactoringHistory= history;
}
/**
* Hook method which is called when the specified refactoring is going to be
* executed.
*
* @param refactoring
* the refactoring about to be executed
* @param descriptor
* the refactoring descriptor
* @param monitor
* the progress monitor to use
* @return a status describing the outcome of the initialization
*/
protected RefactoringStatus aboutToPerformRefactoring(final Refactoring refactoring, final RefactoringDescriptor descriptor, final IProgressMonitor monitor) {
Assert.isNotNull(refactoring);
Assert.isNotNull(descriptor);
return new RefactoringStatus();
}
/**
* Method which is called to create a refactoring instance from a
* refactoring descriptor. The refactoring must be in an initialized state
* at the return of the method call. The default implementation delegates
* the task to the refactoring descriptor.
*
* @param descriptor
* the refactoring descriptor
* @param status
* a refactoring status to describe the outcome of the
* initialization
* @return the refactoring, or <code>null</code> if this refactoring
* descriptor represents the unknown refactoring, or if no
* refactoring contribution is available for this refactoring
* descriptor
* @throws CoreException
* if an error occurs while creating the refactoring instance
*/
protected Refactoring createRefactoring(final RefactoringDescriptor descriptor, final RefactoringStatus status) throws CoreException {
Assert.isNotNull(descriptor);
return descriptor.createRefactoring(status);
}
/**
* Returns the execution status. Guaranteed not to be <code>null</code>.
*
* @return the status of the session
*/
public final RefactoringStatus getExecutionStatus() {
return fExecutionStatus;
}
/**
* Hook method which is called when the specified refactoring has been
* performed.
*
* @param refactoring
* the refactoring which has been performed
* @param monitor
* the progress monitor to use
*/
protected void refactoringPerformed(final Refactoring refactoring, final IProgressMonitor monitor) {
Assert.isNotNull(refactoring);
Assert.isNotNull(monitor);
// Do nothing
}
/**
* {@inheritDoc}
*/
public void run(final IProgressMonitor monitor) throws CoreException {
fExecutionStatus= new RefactoringStatus();
final RefactoringDescriptorProxy[] proxies= fRefactoringHistory.getDescriptors();
monitor.beginTask(RefactoringCoreMessages.PerformRefactoringHistoryOperation_perform_refactorings, 160 * proxies.length);
final IRefactoringHistoryService service= RefactoringHistoryService.getInstance();
try {
service.connect();
for (int index= 0; index < proxies.length && !fExecutionStatus.hasFatalError(); index++) {
final RefactoringDescriptor descriptor= proxies[index].requestDescriptor(new SubProgressMonitor(monitor, 10, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));
if (descriptor != null) {
Refactoring refactoring= null;
try {
refactoring= createRefactoring(descriptor, fExecutionStatus);
} catch (CoreException exception) {
fExecutionStatus.merge(RefactoringStatus.create(exception.getStatus()));
}
if (refactoring != null) {
final PerformRefactoringOperation operation= new PerformRefactoringOperation(refactoring, CheckConditionsOperation.ALL_CONDITIONS);
try {
final RefactoringStatus status= aboutToPerformRefactoring(refactoring, descriptor, new SubProgressMonitor(monitor, 50, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));
if (!status.hasFatalError())
ResourcesPlugin.getWorkspace().run(operation, new SubProgressMonitor(monitor, 90, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));
else
fExecutionStatus.merge(status);
} finally {
refactoringPerformed(refactoring, new SubProgressMonitor(monitor, 10, SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));
}
fExecutionStatus.merge(operation.getConditionStatus());
if (!fExecutionStatus.hasFatalError())
fExecutionStatus.merge(operation.getValidationStatus());
}
}
}
} finally {
service.disconnect();
monitor.done();
}
}
}