/**
* This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details.
*/
package edu.illinois.codingspectator.refactorings.parser;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
import org.eclipse.ltk.internal.core.refactoring.RefactoringCorePlugin;
import org.eclipse.ltk.internal.core.refactoring.history.DefaultRefactoringDescriptor;
import org.eclipse.ltk.internal.core.refactoring.history.RefactoringContributionManager;
import org.eclipse.ltk.internal.core.refactoring.history.RefactoringHistoryManager;
import edu.illinois.codingspectator.data.CodingSpectatorDataPlugin;
import edu.illinois.codingspectator.efs.EFSFile;
/**
*
* @author Mohsen Vakilian
* @author nchen
*
*/
@SuppressWarnings("restriction")
public class RefactoringLog {
public enum LogType {
ECLIPSE, PERFORMED, CANCELLED, UNAVAILABLE
}
EFSFile historyFolder;
private static final String ECLIPSE_REFACTORINGS= "eclipse";
private static final String CANCELED_REFACTORINGS= "canceled";
private static final String PERFORMED_REFACTORINGS= "performed";
private static final String UNAVAILABLE_REFACTORINGS= "unavailable";
private static final IPath REFACTORING_HISTORY_LOCATION= CodingSpectatorDataPlugin.getVersionedStorageLocation();
private static Map<LogType, String> logTypeToString= new HashMap<LogType, String>();
private static Map<String, LogType> stringToLogType= new HashMap<String, LogType>();
static {
logTypeToString.put(LogType.ECLIPSE, ECLIPSE_REFACTORINGS);
logTypeToString.put(LogType.CANCELLED, CANCELED_REFACTORINGS);
logTypeToString.put(LogType.PERFORMED, PERFORMED_REFACTORINGS);
logTypeToString.put(LogType.UNAVAILABLE, UNAVAILABLE_REFACTORINGS);
for (Map.Entry<LogType, String> logTypeToStringEntry : logTypeToString.entrySet()) {
stringToLogType.put(logTypeToStringEntry.getValue(), logTypeToStringEntry.getKey());
}
}
public static Set<LogType> getLogTypes() {
return Collections.unmodifiableSet(logTypeToString.keySet());
}
public static boolean isLogType(String logName) {
return logTypeToString.values().contains(logName);
}
public static LogType toLogType(String logTypeString) {
return stringToLogType.get(logTypeString);
}
public static String toString(LogType logType) {
return logTypeToString.get(logType);
}
public RefactoringLog(IPath pathToHistoryFolder) {
historyFolder= new EFSFile(pathToHistoryFolder);
}
public RefactoringLog(LogType logType) {
this((logType == LogType.ECLIPSE) ? RefactoringCorePlugin.getDefault().getStateLocation().append(".refactorings") : getRefactoringStorageLocation("refactorings/"
+ toString(logType)));
}
public String getPathToRefactoringHistoryFolder() {
return historyFolder.getPath().toOSString();
}
public boolean exists() {
return historyFolder.exists();
}
public void delete() throws CoreException {
historyFolder.delete();
}
public static IPath getRefactoringStorageLocation(String directory) {
return REFACTORING_HISTORY_LOCATION.append(directory);
}
public Collection<CapturedRefactoringDescriptor> getRefactoringDescriptors(String javaProjectName) {
RefactoringHistoryManager.setPopulateProxiesWithRefactoringDescriptorFolder(); // Turn on storing and extracting of file path (timestamp) in RefactoringDescriptorProxy
RefactoringContributionManager.getInstance().setMustCreateDefaultRefactoringDescriptor(true);
RefactoringHistoryManager refactoringHistoryManager= new RefactoringHistoryManager(historyFolder.append(javaProjectName).getFileStore(), javaProjectName);
RefactoringHistory refactoringHistory= refactoringHistoryManager.readRefactoringHistory(0, Long.MAX_VALUE, new NullProgressMonitor());
RefactoringDescriptorProxy[] refactoringDescriptorProxies= refactoringHistory.getDescriptors();
Collection<CapturedRefactoringDescriptor> refactoringDescriptors= new ArrayList<CapturedRefactoringDescriptor>();
for (RefactoringDescriptorProxy refactoringDescriptorProxy : refactoringDescriptorProxies) {
DefaultRefactoringDescriptor refactoringDescriptor= (DefaultRefactoringDescriptor)refactoringHistoryManager.requestDescriptor(refactoringDescriptorProxy, new NullProgressMonitor());
if (refactoringDescriptor != null) {
refactoringDescriptors.add(new CapturedRefactoringDescriptor(refactoringDescriptor));
}
}
RefactoringHistoryManager.unsetPopulateProxiesWithRefactoringDescriptorFolder(); // Turn off storing and extracting of file path (timestamp) in RefactoringDescriptorProxy
return refactoringDescriptors;
}
public Collection<CapturedRefactoringDescriptor> getRefactoringDescriptors() throws CoreException {
Collection<CapturedRefactoringDescriptor> refactoringDescriptors= new ArrayList<CapturedRefactoringDescriptor>();
for (String projectName : historyFolder.childNames()) {
refactoringDescriptors.addAll(getRefactoringDescriptors(projectName));
}
return refactoringDescriptors;
}
public void copy(RefactoringLog destination) throws CoreException {
historyFolder.copyTo(destination.historyFolder);
}
}