package com.baselet.plugin.refactoring;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.ISharableParticipant;
import org.eclipse.ltk.core.refactoring.participants.MoveArguments;
import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
import org.eclipse.ltk.core.refactoring.participants.RefactoringArguments;
import org.eclipse.ltk.core.refactoring.resource.MoveResourceChange;
import com.baselet.plugin.UmletPluginUtils;
/**
* Participant updating img tags in JavaDocs when a diagram file is moved.
*/
public class MoveResourceParticipant extends MoveParticipant implements ISharableParticipant {
private static class Entry {
Object element;
MoveArguments args;
public Entry(Object element, MoveArguments args) {
super();
this.element = element;
this.args = args;
}
}
private final List<Entry> entries = new ArrayList<MoveResourceParticipant.Entry>();
@Override
protected boolean initialize(Object element) {
// don't participate in package renames
if ("org.eclipse.jdt.ui.renamePackageProcessor".equals(getProcessor().getIdentifier())) {
return false;
}
entries.add(new Entry(element, getArguments()));
return true;
}
@Override
public String getName() {
return "Umlet Move Resource Participant";
}
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException {
return RefactoringStatus.create(Status.OK_STATUS);
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
final Set<Object> affectedElements = new HashSet<Object>();
for (Entry entry : entries) {
affectedElements.add(entry.element);
}
UmletRefactoringProcessorManager mgr = new UmletRefactoringProcessorManager();
for (Entry entry : entries) {
Object element = entry.element;
if (!(element instanceof IResource)) {
continue;
}
IResource origResource = (IResource) element;
final IFolder destinationFolder;
{
Object destination = entry.args.getDestination();
if (!(destination instanceof IFolder)) {
continue;
}
destinationFolder = (IFolder) destination;
}
IJavaProject javaProject = UmletPluginUtils.getJavaProject(origResource.getProject());
if (javaProject == null) {
continue;
}
if (element instanceof IFile) {
final IFile origFile = (IFile) element;
if (!origFile.exists()) {
continue;
}
if ("uxf".equals(origFile.getFileExtension())) {
// we're moving the diagram
mgr.add(new UpdateImgReferencesProcessor(javaProject) {
@Override
protected IFile calculateImgDestination(IFile img, ICompilationUnit referencingCompilationUnit) {
if (affectedElements.contains(img)) {
return null;
}
IFile uxfFile = UmletPluginUtils.getUxfDiagramForImgFile(img);
if (origFile.equals(uxfFile)) {
return destinationFolder.getFile(img.getName());
}
return null;
}
});
mgr.add(new MovePngProcessor(origFile) {
@Override
protected IContainer getDestinationFolder(IFile pngFile, IFile affectedDiagram) {
if (affectedElements.contains(pngFile)) {
return null;
}
return destinationFolder;
}
});
}
else if ("png".equals(origFile.getFileExtension())) {
IFile uxfFile = UmletPluginUtils.getUxfDiagramForImgFile(origFile);
if (!uxfFile.exists()) {
continue;
}
// update references to png
mgr.add(new UpdateImgReferencesProcessor(javaProject) {
@Override
protected IFile calculateImgDestination(IFile img, ICompilationUnit referencingCompilationUnit) {
if (origFile.equals(img)) {
return destinationFolder.getFile(img.getName());
}
return null;
}
});
// move uxfFile
mgr.add(new MoveResourceChange(uxfFile, destinationFolder));
}
continue;
}
if (origResource instanceof IFolder) {
final IFolder origFolder = (IFolder) origResource;
final IFolder newFolder = destinationFolder.getFolder(origFolder.getName());
final IPath origFolderPath = origFolder.getFullPath();
mgr.add(new UpdateImgReferencesProcessor(javaProject) {
@Override
protected IFile calculateImgDestination(IFile img, ICompilationUnit referencingCompilationUnit) {
IPath imgPath = img.getFullPath();
if (origFolderPath.isPrefixOf(imgPath)) {
IPath relativePath = imgPath.makeRelativeTo(origFolderPath);
return newFolder.getFile(relativePath);
}
return null;
}
});
continue;
}
}
return mgr.createChange(pm);
}
@Override
public void addElement(Object element, RefactoringArguments arguments) {
entries.add(new Entry(element, (MoveArguments) arguments));
}
}