blob: 67e3d56f47a51470040462a0bfee39da33d6bacd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2011 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.jdt.internal.corext.refactoring.reorg;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.IParticipantDescriptorFilter;
import org.eclipse.ltk.core.refactoring.participants.MoveArguments;
import org.eclipse.ltk.core.refactoring.participants.ParticipantManager;
import org.eclipse.ltk.core.refactoring.participants.RefactoringArguments;
import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
import org.eclipse.ltk.core.refactoring.participants.ValidateEditChecker;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.corext.refactoring.participants.ResourceModifications;
public class MoveModifications extends RefactoringModifications {
private List<Object> fMoves;
private List<RefactoringArguments> fMoveArguments;
private List<IParticipantDescriptorFilter> fParticipantDescriptorFilter;
public MoveModifications() {
fMoves= new ArrayList<Object>();
fMoveArguments= new ArrayList<RefactoringArguments>();
fParticipantDescriptorFilter= new ArrayList<IParticipantDescriptorFilter>();
}
public void move(IResource resource, MoveArguments args) {
add(resource, args, null);
}
public void move(IPackageFragmentRoot sourceFolder, MoveArguments arguments) {
add(sourceFolder, arguments, null);
IResource sourceResource= sourceFolder.getResource();
if (sourceResource != null) {
getResourceModifications().addMove(sourceResource,
new MoveArguments(getResourceDestination(arguments), arguments.getUpdateReferences()));
IFile classpath= getClasspathFile(sourceResource);
if (classpath != null) {
getResourceModifications().addChanged(classpath);
}
classpath= getClasspathFile(getResourceDestination(arguments));
if (classpath != null) {
getResourceModifications().addChanged(classpath);
}
}
}
public void move(IPackageFragment pack, MoveArguments args) throws CoreException {
add(pack, args, null);
if (pack.getResource() == null)
return;
IPackageFragmentRoot javaDestination= (IPackageFragmentRoot) args.getDestination();
if (javaDestination.getResource() == null)
return;
IPackageFragment newPack= javaDestination.getPackageFragment(pack.getElementName());
if (!pack.hasSubpackages() && !newPack.exists()) {
// we can do a simple move
IContainer resourceDestination= newPack.getResource().getParent();
createIncludingParents(resourceDestination);
getResourceModifications().addMove(
pack.getResource(),
new MoveArguments(resourceDestination, args.getUpdateReferences()));
} else {
IContainer resourceSource= (IContainer)pack.getResource();
IContainer resourceDestination= (IContainer) newPack.getResource();
createIncludingParents(resourceDestination);
MoveArguments arguments= new MoveArguments(resourceDestination, args.getUpdateReferences());
IResource[] resourcesToMove= collectResourcesOfInterest(pack);
Set<IResource> allMembers= new HashSet<IResource>(Arrays.asList(resourceSource.members()));
for (int i= 0; i < resourcesToMove.length; i++) {
IResource toMove= resourcesToMove[i];
getResourceModifications().addMove(toMove, arguments);
allMembers.remove(toMove);
}
for (Iterator<IResource> iter= allMembers.iterator(); iter.hasNext();) {
IResource element= iter.next();
if (element instanceof IFile) {
getResourceModifications().addDelete(element);
iter.remove();
}
}
if (allMembers.isEmpty()) {
getResourceModifications().addDelete(resourceSource);
}
}
}
public void move(ICompilationUnit unit, MoveArguments args) throws CoreException {
add(unit, args, null);
IType[] types= unit.getTypes();
for (int tt= 0; tt < types.length; tt++) {
add(types[tt], args, null);
}
IResource resourceDestination= getResourceDestination(args);
if (resourceDestination != null && unit.getResource() != null) {
IResource parent= resourceDestination;
while (!parent.exists()) {
getResourceModifications().addCreate(parent);
parent= parent.getParent();
}
getResourceModifications().addMove(unit.getResource(), new MoveArguments(resourceDestination, args.getUpdateReferences()));
}
}
@Override
public void buildDelta(IResourceChangeDescriptionFactory builder) {
for (int i= 0; i < fMoves.size(); i++) {
Object element= fMoves.get(i);
if (element instanceof IResource) {
ResourceModifications.buildMoveDelta(builder, (IResource) element, (MoveArguments) fMoveArguments.get(i));
}
}
getResourceModifications().buildDelta(builder);
}
@Override
public void buildValidateEdits(ValidateEditChecker checker) {
for (Iterator<Object> iter= fMoves.iterator(); iter.hasNext();) {
Object element= iter.next();
if (element instanceof ICompilationUnit) {
ICompilationUnit unit= (ICompilationUnit)element;
IResource resource= unit.getResource();
if (resource != null && resource.getType() == IResource.FILE) {
checker.addFile((IFile)resource);
}
}
}
}
@Override
public RefactoringParticipant[] loadParticipants(RefactoringStatus status, RefactoringProcessor owner, String[] natures, SharableParticipants shared) {
List<RefactoringParticipant> result= new ArrayList<RefactoringParticipant>();
for (int i= 0; i < fMoves.size(); i++) {
result.addAll(Arrays.asList(ParticipantManager.loadMoveParticipants(status,
owner, fMoves.get(i),
(MoveArguments) fMoveArguments.get(i),
fParticipantDescriptorFilter.get(i),
natures, shared)));
}
result.addAll(Arrays.asList(getResourceModifications().getParticipants(status, owner, natures, shared)));
return result.toArray(new RefactoringParticipant[result.size()]);
}
private void add(Object element, RefactoringArguments args, IParticipantDescriptorFilter filter) {
Assert.isNotNull(element);
Assert.isNotNull(args);
fMoves.add(element);
fMoveArguments.add(args);
fParticipantDescriptorFilter.add(filter);
}
private IResource getResourceDestination(MoveArguments args) {
Object genericDestination= args.getDestination();
IResource resourceDestination= null;
if (genericDestination instanceof IJavaElement) {
resourceDestination= ((IJavaElement)genericDestination).getResource();
} else if (genericDestination instanceof IResource) {
resourceDestination= (IResource)genericDestination;
}
return resourceDestination;
}
}