package org.checkerframework.eclipse.builder;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.checkerframework.eclipse.CheckerPlugin;
import org.checkerframework.eclipse.actions.CheckerManager;
import org.checkerframework.eclipse.actions.CheckerWorker;
import org.checkerframework.eclipse.prefs.CheckerPreferences;
import org.checkerframework.eclipse.util.MutexSchedulingRule;
import org.checkerframework.eclipse.util.PluginUtil;
import org.checkerframework.eclipse.util.ResourceUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.preference.IPreferenceStore;
public class CheckerBuilder extends IncrementalProjectBuilder {
public static final String BUILDER_ID = "checkers.eclipse.checkerbuilder";
public CheckerBuilder() {
super();
}
@Override
protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
if (isBuildEnabled()) {
if (kind == FULL_BUILD) {
fullBuild();
} else {
IResourceDelta delta = getDelta(getProject());
if (delta == null) {
fullBuild();
} else {
incrementalBuild(delta);
}
}
}
return null;
}
private boolean isBuildEnabled() {
IPreferenceStore store = CheckerPlugin.getDefault().getPreferenceStore();
return store.getBoolean(CheckerPreferences.PREF_CHECKER_AUTO_BUILD);
}
private void incrementalBuild(IResourceDelta delta) {
CheckerResourceVisitor visitor = new CheckerResourceVisitor();
try {
delta.accept(visitor);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
runWorker(
JavaCore.create(getProject()),
new LinkedHashSet<String>(visitor.getBuildFiles()),
CheckerManager.getSelectedClasses());
}
private void fullBuild() throws CoreException {
IJavaProject project = JavaCore.create(getProject());
Set<String> sourceNames = ResourceUtils.sourceFilesOf(project);
runWorker(project, sourceNames, CheckerManager.getSelectedClasses());
}
private void runWorker(
IJavaProject project, Set<String> sourceNames, List<String> checkerNames) {
Job checkerJob =
new CheckerWorker(
project,
sourceNames.toArray(new String[] {}),
PluginUtil.join(",", checkerNames),
true);
checkerJob.setUser(true);
checkerJob.setPriority(Job.BUILD);
checkerJob.setRule(new MutexSchedulingRule());
checkerJob.schedule();
}
}