/*****************************************************************************
* Copyright (c) 2006-2013, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
*****************************************************************************/
package org.eclipse.buckminster.core.helpers;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.buckminster.core.Messages;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.osgi.util.NLS;
/**
* Block job execution based on the name or class of the job.
*
* @author Thomas Hallgren
*/
public class JobBlocker extends JobChangeAdapter {
private static void trace(String format, Object... args) {
// We can't trust that the CorePlugin is still active
// since some jobs might outlive it.
//
// try
// {
// CorePlugin.getLogger().debug(format, args);
// }
// catch(Throwable e)
// {
// if(args.length > 0)
// format = String.format(format, args);
// System.out.println(format);
// }
}
private final Set<String> blockByName = Collections.synchronizedSet(new HashSet<String>());
private final Set<String> blockByClass = Collections.synchronizedSet(new HashSet<String>());
public JobBlocker() {
Job.getJobManager().addJobChangeListener(this);
}
@Override
public void aboutToRun(IJobChangeEvent event) {
Job job = event.getJob();
String jobName = job.getName();
String className = job.getClass().getName();
trace(NLS.bind(Messages.JOB_AboutToRun_0, jobName));
if (blockByName.contains(jobName) || blockByClass.contains(className)) {
job.cancel();
trace(NLS.bind(Messages.Blocked_0_1, className, jobName));
return;
}
}
public void addClassBlock(Class<? extends Job> classToBlock) {
blockByClass.add(classToBlock.getName());
}
public void addClassBlock(String className) {
blockByClass.add(className);
}
public void addNameBlock(String nameToBlock) {
blockByName.add(nameToBlock);
}
public void release() {
Job.getJobManager().removeJobChangeListener(this);
}
public void removeClassBlock(Class<? extends Job> classToBlock) {
blockByClass.remove(classToBlock.getName());
}
public void removeClassBlock(String className) {
blockByClass.remove(className);
}
public void removeNameBlock(String nameToBlock) {
blockByName.remove(nameToBlock);
}
}