package com.baselet.plugin.refactoring; 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.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.IResourceMapper; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; import org.eclipse.ltk.core.refactoring.participants.RenameParticipant; import com.baselet.plugin.UmletPluginUtils; /** * Participant updating img tags in JavaDocs when a package is renamed. */ public class RenamePackageParticipant extends RenameParticipant { UmletRefactoringProcessorManager mgr = new UmletRefactoringProcessorManager(); @Override protected boolean initialize(Object element) { if (!(element instanceof IPackageFragment)) { return false; } IPackageFragment packageFragment = (IPackageFragment) element; IJavaProject javaProject = packageFragment.getJavaProject(); if (javaProject == null) { return false; } final IPackageFragmentRoot packageFragmentRoot = UmletPluginUtils.getPackageFragmentRoot(packageFragment); if (packageFragmentRoot == null) { return false; } if (!(getProcessor() instanceof IResourceMapper)) { return false; } final IResourceMapper resourceMapper = (IResourceMapper) getProcessor(); mgr.add(new UpdateImgReferencesProcessor(javaProject) { @Override protected void calculateDestination(IFile img, ICompilationUnit referencingCompilationUnit, Destination dest) throws CoreException { dest.cuDestination = (IFile) resourceMapper.getRefactoredResource(referencingCompilationUnit.getCorrespondingResource()); // Search the first parent resource of the file which has a corresponding java element. // Must be a package or the root. IJavaElement parentElement; IResource parent; { parent = img; do { parent = parent.getParent(); parentElement = JavaCore.create(parent); } while (parentElement == null && parent != null); } if (parentElement != null && parent != null) { IResource refactoredParent = resourceMapper.getRefactoredResource(parent); if (refactoredParent instanceof IFolder) { dest.imgFileDestination = ((IFolder) refactoredParent).getFile(img.getFullPath().makeRelativeTo(parent.getFullPath())); } } } @Override protected IFile calculateImgDestination(IFile uxf, ICompilationUnit referencingCompilationUnit) throws JavaModelException { throw new UnsupportedOperationException(); } }); return true; } @Override public String getName() { return "Umlet Rename Package Participant"; } @Override public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException { return RefactoringStatus.create(Status.OK_STATUS); } @Override public Change createPreChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { return mgr.createChange(pm); } @Override public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { return null; } }