blob: c2cadfd84f62378fb965167d3c7e309db80d3f85 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005 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 API and implementation
**********************************************************************/
package org.eclipse.wst.server.core.internal;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.ServerUtil;
/**
* A Job that can start another job upon successful completion.
*/
public abstract class ChainedJob extends Job {
private IServer server;
private Job nextJob;
private IJobChangeListener listener;
/**
* Create a new dependant job.
*
* @param name the name of the job
* @param server the server to publish to
*/
public ChainedJob(String name, IServer server) {
super(name);
this.server = server;
}
/**
* @see Job#belongsTo(java.lang.Object)
*/
public boolean belongsTo(Object family) {
return ServerUtil.SERVER_JOB_FAMILY.equals(family);
}
/**
* Returns the server that this job was created with.
*
* @return a server
*/
public IServer getServer() {
return server;
}
/**
* Create a listener for when this job finishes.
*/
protected void createListener() {
if (listener != null)
return;
listener = new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
jobDone(event.getResult());
}
};
addJobChangeListener(listener);
}
/**
* Called when this job is complete.
*
* @param status the result of the current job
*/
protected void jobDone(IStatus status) {
if (listener == null)
return;
removeJobChangeListener(listener);
listener = null;
if (nextJob != null && status != null && status.getSeverity() != IStatus.ERROR
&& status.getSeverity() != IStatus.CANCEL)
nextJob.schedule();
}
/**
* Set the next job, which should be scheduled if and only if this job completes
* successfully. The next job will be run as long as the result of this job is
* not an ERROR or CANCEL status.
* This method is not thread-safe. However, the next job can be changed anytime
* up until the current job completes.
*
* @param job the next job that should be scheduled
*/
public void setNextJob(Job job) {
nextJob = job;
createListener();
}
}