blob: b66fad17274742f65ab3a04bd118a74085c3bac6 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2008 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.common.utils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
/**
* Job class that is re-startable
*
* @author Weiping Lu
* @since 1.5
*/
public abstract class RestartableJob extends Job {
protected static boolean localDebug = false;
private boolean toRestart = true;
private boolean schedulingLocked = false;
private boolean enabled = true;
public RestartableJob(String name) {
super(name);
}
public final void guardedSchedule(long delay) {
guardedSchedule(delay, false);
}
private void guardedSchedule(long delay, boolean inRunCall) {
if ( ! isEnabled()) {
return;
}
if (!inRunCall && getState() != Job.NONE) {
return;
}
if (isSchedulingLocked()) {
return;
}
if (localDebug) {
System.out.println("LD> guardedSchedule completed"); //$NON-NLS-1$
}
setSchedulingLocked(true);
schedule(delay);
}
protected final IStatus run(IProgressMonitor monitor) {
if (localDebug) {
System.out.println("LD> RestartableJob.run"); //$NON-NLS-1$
}
setSchedulingLocked(false);
setToRestart(false);
IStatus status = Status.OK_STATUS;
try {
status = restartableRun(monitor);
} catch (RestartInterruptException e) {
guardedSchedule(e.getDelay(), true);
}
return Status.OK_STATUS;
}
protected abstract IStatus restartableRun(IProgressMonitor monitor) throws RestartInterruptException;
protected abstract void resetToRestart();
private synchronized boolean isSchedulingLocked() {
return schedulingLocked;
}
private synchronized void setSchedulingLocked(boolean schedulingLocked) {
this.schedulingLocked = schedulingLocked;
}
private synchronized boolean isToRestart() {
return toRestart;
}
private synchronized void setToRestart(boolean toRestart) {
this.toRestart = toRestart;
}
public void enableToRestart() {
setToRestart(true);
}
public void checkRestartInterruptException(long delay) throws RestartInterruptException {
if (isToRestart()) {
resetToRestart();
throw new RestartInterruptException(delay);
}
}
public static class RestartInterruptException extends Exception {
private long delay = 0;
public RestartInterruptException(long delay) {
this.delay = delay;
}
public long getDelay() {
return delay;
}
}
public synchronized boolean isEnabled() {
return enabled;
}
public synchronized void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}