blob: ff9c127ff4a87c97746ba59c5c43ed688e01c74a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.internal.ui.refactoring.model;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.team.core.diff.IDiff;
import org.eclipse.team.core.mapping.IMergeContext;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryService;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIPlugin;
import org.eclipse.ltk.ui.refactoring.history.RefactoringHistoryWizard;
/**
* Partial implementation of a refactoring history merge wizard.
* <p>
* This refactoring history wizard executes refactorings from a refactoring
* history, but uses the time stamps of the refactoring history for the new
* local refactoring history entries.
* </p>
* <p>
* Additionally, this refactoring wizard collects all added, removed and
* otherwise changed files which happened during the execution of the
* refactorings.
* </p>
*
* @since 3.2
*/
public abstract class RefactoringHistoryMergeWizard extends RefactoringHistoryWizard {
/** Workspace change listener */
private class WorkspaceChangeListener implements IResourceChangeListener {
/**
* {@inheritDoc}
*/
public void resourceChanged(final IResourceChangeEvent event) {
final IResourceDelta delta= event.getDelta();
if (delta != null) {
try {
delta.accept(new IResourceDeltaVisitor() {
public final boolean visit(final IResourceDelta current) throws CoreException {
final IResource resource= current.getResource();
if (!resource.isDerived()) {
if (resource.getType() == IResource.FILE) {
switch (delta.getKind()) {
case IResourceDelta.ADDED:
fAddedFiles.add(resource);
break;
case IResourceDelta.REMOVED:
fRemovedFiles.add(resource);
break;
case IResourceDelta.CHANGED:
fChangedFiles.add(resource);
break;
}
}
}
return true;
}
});
} catch (CoreException exception) {
RefactoringUIPlugin.log(exception);
}
}
}
}
/** The set of added files */
private final Set fAddedFiles= new HashSet();
/** The set of changed files */
private final Set fChangedFiles= new HashSet();
/** The workspace change listener */
private final IResourceChangeListener fListener= new WorkspaceChangeListener();
/** The set of removed files */
private final Set fRemovedFiles= new HashSet();
/**
* Creates a new refactoring history merge wizard.
*
* @param caption
* the caption of the wizard window
* @param title
* the title of the overview page
* @param description
* the description of the overview page
*/
protected RefactoringHistoryMergeWizard(final String caption, final String title, final String description) {
super(caption, title, description);
}
/**
* {@inheritDoc}
*/
protected RefactoringStatus aboutToPerformHistory(final IProgressMonitor monitor) {
fAddedFiles.clear();
fRemovedFiles.clear();
fChangedFiles.clear();
ResourcesPlugin.getWorkspace().addResourceChangeListener(fListener, IResourceChangeEvent.POST_CHANGE);
return super.aboutToPerformHistory(monitor);
}
/**
* {@inheritDoc}
*/
protected RefactoringStatus aboutToPerformRefactoring(final Refactoring refactoring, final RefactoringDescriptor descriptor, final IProgressMonitor monitor) {
Assert.isNotNull(descriptor);
final long stamp= descriptor.getTimeStamp();
if (stamp >= 0)
RefactoringHistoryService.getInstance().setOverrideTimeStamp(stamp);
return super.aboutToPerformRefactoring(refactoring, descriptor, monitor);
}
/**
* Returns the added files.
*
* @return the added files
*/
public Set getAddedFiles() {
return fAddedFiles;
}
/**
* Returns the changed files.
*
* @return the changed files
*/
public Set getChangedFiles() {
return fChangedFiles;
}
/**
* Returns the removed files.
*
* @return the removed files
*/
public Set getRemovedFiles() {
return fRemovedFiles;
}
/**
* {@inheritDoc}
*/
protected RefactoringStatus historyPerformed(final IProgressMonitor monitor) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(fListener);
RefactoringHistoryService.getInstance().setOverrideTimeStamp(-1);
return super.historyPerformed(monitor);
}
/**
* {@inheritDoc}
*/
protected RefactoringStatus refactoringPerformed(final Refactoring refactoring, final IProgressMonitor monitor) {
RefactoringHistoryService.getInstance().setOverrideTimeStamp(-1);
return super.refactoringPerformed(refactoring, monitor);
}
/**
* Resolves the conflicts which have been introduced by the executed
* refactorings.
*
* @param context
* the merge context
*/
public void resolveConflicts(final IMergeContext context) {
Assert.isNotNull(context);
for (final Iterator iterator= fChangedFiles.iterator(); iterator.hasNext();) {
final IResource resource= (IResource) iterator.next();
final IDiff diff= context.getDiffTree().getDiff(resource);
if (diff != null) {
try {
context.markAsMerged(diff, true, new NullProgressMonitor());
} catch (CoreException exception) {
RefactoringUIPlugin.log(exception);
}
}
}
for (final Iterator iterator= fAddedFiles.iterator(); iterator.hasNext();) {
final IResource resource= (IResource) iterator.next();
final IDiff diff= context.getDiffTree().getDiff(resource);
if (diff != null) {
try {
context.markAsMerged(diff, true, new NullProgressMonitor());
} catch (CoreException exception) {
RefactoringUIPlugin.log(exception);
}
}
}
for (final Iterator iterator= fRemovedFiles.iterator(); iterator.hasNext();) {
final IResource resource= (IResource) iterator.next();
final IDiff diff= context.getDiffTree().getDiff(resource);
if (diff != null) {
try {
context.markAsMerged(diff, true, new NullProgressMonitor());
} catch (CoreException exception) {
RefactoringUIPlugin.log(exception);
}
}
}
}
}