/**
* This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details.
*/
package edu.illinois.codingtracker.listeners;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.ltk.core.refactoring.RefactoringCore;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.IRefactoringExecutionListener;
import org.eclipse.ltk.core.refactoring.history.RefactoringExecutionEvent;
import edu.illinois.codingtracker.helpers.ResourceHelper;
/**
*
* @author Stas Negara
*
*/
public class RefactoringExecutionListener extends BasicListener implements IRefactoringExecutionListener {
public static void register() {
RefactoringCore.getHistoryService().addExecutionListener(new RefactoringExecutionListener());
}
@Override
public void executionNotification(RefactoringExecutionEvent event) {
int eventType= event.getEventType();
if (isBeginRefactoring(eventType)) {
isRefactoring= true;
trackProjectsAffectedByRefactoring(event);
operationRecorder.recordStartedRefactoring(getRefactoringDescriptor(event), eventType);
}
}
private boolean isBeginRefactoring(int eventType) {
return eventType == RefactoringExecutionEvent.ABOUT_TO_PERFORM || eventType == RefactoringExecutionEvent.ABOUT_TO_REDO ||
eventType == RefactoringExecutionEvent.ABOUT_TO_UNDO;
}
private void trackProjectsAffectedByRefactoring(RefactoringExecutionEvent event) {
IProject refactoredProject= getRefactoredProject(event);
if (refactoredProject != null && refactoredProject.exists()) {
Set<IJavaProject> affectedJavaProjects= new HashSet<IJavaProject>();
affectedJavaProjects.add(getJavaProject(refactoredProject));
IProject[] referencingProjects= refactoredProject.getReferencingProjects();
for (IProject referencingProject : referencingProjects) {
if (referencingProject.exists()) { //Actually, should always exist here
affectedJavaProjects.add(getJavaProject(referencingProject));
}
}
operationRecorder.ensureReferencingProjectsAreCurrent(refactoredProject.getName(), getProjectNames(referencingProjects));
operationRecorder.ensureOptionsAreCurrent(affectedJavaProjects);
}
}
private IProject getRefactoredProject(RefactoringExecutionEvent event) {
IProject refactoredProject= null;
String projectName= getRefactoringDescriptor(event).getProject();
if (projectName != null && Path.EMPTY.isValidSegment(projectName)) {
refactoredProject= ResourceHelper.getWorkspaceRoot().getProject(projectName);
}
return refactoredProject;
}
private RefactoringDescriptor getRefactoringDescriptor(RefactoringExecutionEvent event) {
RefactoringDescriptorProxy refactoringDescriptorProxy= event.getDescriptor();
RefactoringDescriptor refactoringDescriptor= refactoringDescriptorProxy.requestDescriptor(new NullProgressMonitor());
//Refactoring descriptor should never be null here (according to how RefactoringExecutionEvent object is constructed in
//RefactoringHistoryService)
return refactoringDescriptor;
}
private IJavaProject getJavaProject(IProject project) {
return JavaCore.create(project);
}
private Set<String> getProjectNames(IProject[] projects) {
Set<String> projectNames= new HashSet<String>();
for (IProject project : projects) {
projectNames.add(project.getName());
}
return projectNames;
}
}