/*
* Copyright (C) 2009 Stefan Reinhard, Stefan Sidler
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
* http://ifs.hsr.ch/
*
*/
package org.codehaus.groovy.eclipse.refactoring.core.rename;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.groovy.eclipse.refactoring.core.rename.renameLocal.GroovyRenameLocalVariableProcessor;
import org.codehaus.groovy.eclipse.refactoring.core.rename.renameLocal.RenameLocalGroovyVariableContribution;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ILocalVariable;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.refactoring.IJavaRefactorings;
import org.eclipse.jdt.core.refactoring.descriptors.RenameJavaElementDescriptor;
import org.eclipse.jdt.groovy.core.util.ReflectionUtils;
import org.eclipse.jdt.internal.ui.refactoring.UserInterfaceManager;
import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameLocalVariableWizard;
import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameUserInterfaceManager;
import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameUserInterfaceStarter;
import org.eclipse.jdt.ui.refactoring.RenameSupport;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
/**
* @author Stefan Reinhard
*/
public class JavaRefactoringDispatcher {
static {
// register our groovy rename processor
UserInterfaceManager uiManager = RenameUserInterfaceManager.getDefault();
ReflectionUtils.executePrivateMethod(UserInterfaceManager.class, "put", new Class[] {Class.class, Class.class, Class.class},
uiManager, new Object[] { GroovyRenameLocalVariableProcessor.class, RenameUserInterfaceStarter.class, RenameLocalVariableWizard.class });
}
private IJavaElement element;
public JavaRefactoringDispatcher(IJavaElement element) {
this.element = element;
}
public RenameSupport dispatchJavaRenameRefactoring() throws CoreException {
if (element instanceof IType) {
return createTypeRefactoring((IType)element);
} else if (element instanceof IField) {
return createFieldRefactoring((IField)element);
} else if (element instanceof IMethod) {
return createMethodRefactoring((IMethod)element);
} else if (element instanceof ILocalVariable) {
return createLocalVariableRefactoring();
}
return null;
}
private RenameSupport createLocalVariableRefactoring() throws CoreException {
RenameJavaElementDescriptor descriptor = createDescriptorForLocalVariable();
return RenameSupport.create(descriptor);
}
public RenameJavaElementDescriptor createDescriptorForLocalVariable() {
Map<String, String> args = new HashMap<String, String>();
args.put("name", getNewName());
args.put("input", element.getHandleIdentifier());
RenameJavaElementDescriptor descriptor =
new RenameJavaElementDescriptor(IJavaRefactorings.RENAME_LOCAL_VARIABLE,
element.getJavaProject().getElementName(), "Rename " + element.getElementName(),
null, args, RenameSupport.UPDATE_REFERENCES);
ReflectionUtils.setPrivateField(RefactoringDescriptor.class, "fRefactoringId", descriptor, RenameLocalGroovyVariableContribution.ID);
return descriptor;
}
private RenameSupport createTypeRefactoring(IType type) throws CoreException {
return RenameSupport.create(type, getNewName(), RenameSupport.UPDATE_REFERENCES | RenameSupport.UPDATE_TEXTUAL_MATCHES);
}
private RenameSupport createFieldRefactoring(IField field) throws CoreException {
return RenameSupport.create(field, getNewName(),
RenameSupport.UPDATE_REFERENCES |
RenameSupport.UPDATE_GETTER_METHOD |
RenameSupport.UPDATE_SETTER_METHOD |
RenameSupport.UPDATE_TEXTUAL_MATCHES);
}
private RenameSupport createMethodRefactoring(IMethod method) throws CoreException {
return RenameSupport.create(method, getNewName(), RenameSupport.UPDATE_REFERENCES);
}
private String newName;
public String getNewName() {
if (newName != null) {
return newName;
} else {
return element.getElementName();
}
}
public void setNewName(String name) {
newName = name;
}
}