package org.checkerframework.eclipse.actions;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.checkerframework.eclipse.error.CheckerErrorStatus;
import org.checkerframework.eclipse.javac.CommandlineJavacRunner;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.statushandlers.StatusManager;
public class AddCheckersHandler extends CheckerHandler {
private static final String CHECKERS_QUALS_LOCATION = "lib/checkers-quals.jar";
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = getSelection(event);
IJavaElement element = element(selection);
if (element instanceof IJavaProject) {
IJavaProject javaProject = (IJavaProject) element;
IProject project = javaProject.getProject();
IFile jarFile = project.getFile("checkers-quals.jar");
if (!jarFile.exists()) {
FileInputStream input;
try {
final String checkerQuals =
CommandlineJavacRunner.locatePluginFile(CHECKERS_QUALS_LOCATION)
.getAbsolutePath();
input = new FileInputStream(checkerQuals);
jarFile.create(input, false, null);
} catch (FileNotFoundException e) {
StatusManager manager = StatusManager.getManager();
CheckerErrorStatus status =
new CheckerErrorStatus("Could not find file checkers-quals.jar.");
manager.handle(status, StatusManager.SHOW);
return null;
} catch (CoreException e) {
StatusManager manager = StatusManager.getManager();
CheckerErrorStatus status =
new CheckerErrorStatus(
"Could not create file checkers-quals.jar in project.");
manager.handle(status, StatusManager.SHOW);
return null;
}
try {
IClasspathEntry[] entries = javaProject.getRawClasspath();
IClasspathEntry[] newEntries = new IClasspathEntry[entries.length + 1];
System.arraycopy(entries, 0, newEntries, 0, entries.length);
IClasspathEntry javaEntry =
JavaCore.newLibraryEntry(jarFile.getLocation(), null, null);
newEntries[entries.length] = javaEntry;
javaProject.setRawClasspath(newEntries, null);
} catch (JavaModelException e) {
StatusManager manager = StatusManager.getManager();
CheckerErrorStatus status =
new CheckerErrorStatus(
"Could not add checkers-quals.jar library to project classpath.");
manager.handle(status, StatusManager.SHOW);
return null;
}
} else {
StatusManager manager = StatusManager.getManager();
CheckerErrorStatus status =
new CheckerErrorStatus(
"checkers-quals.jar library already found in project.");
manager.handle(status, StatusManager.SHOW);
}
}
return null;
}
}