/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.python.pydev.refactoring.changes;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.python.pydev.core.docutils.StringUtils;
/**
* Largely gotten from org.eclipse.jdt.internal.corext.refactoring.changes.RenameResourceChange
*/
public final class PyRenameResourceChange extends PyChange {
public static IPath renamedResourcePath(IPath path, String newName) {
return path.removeLastSegments(1).append(newName);
}
private final String fComment;
private final String fNewName;
private final IPath fResourcePath;
private final long fStampToRestore;
private PyRenameResourceChange(IPath resourcePath, String newName, String comment, long stampToRestore) {
fResourcePath = resourcePath;
fNewName = newName;
fComment = comment;
fStampToRestore = stampToRestore;
}
public PyRenameResourceChange(IResource resource, String newName, String comment) {
this(resource.getFullPath(), newName, comment, IResource.NULL_STAMP);
}
public Object getModifiedElement() {
return getResource();
}
public String getName() {
return com.aptana.shared_core.string.StringUtils.format("Rename %s to %s", fResourcePath, fNewName);
}
public String getNewName() {
return fNewName;
}
private IResource getResource() {
return ResourcesPlugin.getWorkspace().getRoot().findMember(fResourcePath);
}
public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException {
IResource resource = getResource();
if (resource == null || !resource.exists()) {
return RefactoringStatus.createFatalErrorStatus(com.aptana.shared_core.string.StringUtils.format("Resource %s does not exist",
fResourcePath));
} else {
return super.isValid(pm, DIRTY);
}
}
public Change perform(IProgressMonitor pm) throws CoreException {
try {
pm.beginTask(getName(), 1);
IResource resource = getResource();
long currentStamp = resource.getModificationStamp();
IPath newPath = renamedResourcePath(fResourcePath, fNewName);
resource.move(newPath, IResource.SHALLOW, pm);
if (fStampToRestore != IResource.NULL_STAMP) {
IResource newResource = ResourcesPlugin.getWorkspace().getRoot().findMember(newPath);
newResource.revertModificationStamp(fStampToRestore);
}
String oldName = fResourcePath.lastSegment();
return new PyRenameResourceChange(newPath, oldName, fComment, currentStamp);
} finally {
pm.done();
}
}
}