package org.eclipse.buckminster.jnlp;
import java.util.LinkedList;
import java.util.Queue;
import org.eclipse.buckminster.core.materializer.MaterializationContext;
import org.eclipse.buckminster.core.materializer.MaterializationJob;
import org.eclipse.buckminster.core.materializer.MaterializerJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
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.JobChangeAdapter;
public class JNLPMaterializationJob extends MaterializationJob
{
public static void runDelegated(MaterializationContext context, IProgressMonitor monitor) throws CoreException
{
JNLPMaterializationJob mbJob = new JNLPMaterializationJob(context, true);
mbJob.internalRun(monitor);
}
protected JNLPMaterializationJob(MaterializationContext ctx, boolean waitForInstall)
{
super(ctx, waitForInstall);
}
@Override
protected void triggerJobs(final IProgressMonitor monitor, final Queue<MaterializerJob> allJobs)
{
final Queue<MaterializerJob> jobsToWakeUp = new LinkedList<MaterializerJob>();
// -- Schedule at most m_maxParallelJobs. After that, let the termination of
// a job schedule a new one until the queue is empty.
//
// This is the listener that schedule a new job on termination of another
//
IJobChangeListener listener = new JobChangeAdapter()
{
@Override
public void aboutToRun(IJobChangeEvent event)
{
if(monitor.isCanceled()
|| (!getMaterializationContext().isContinueOnError() && getMaterializationContext().getStatus()
.getSeverity() == IStatus.ERROR))
cancel();
}
@Override
public void done(IJobChangeEvent event)
{
if(!monitor.isCanceled())
{
MaterializerJob mjob = jobsToWakeUp.poll();
if(mjob != null)
{
mjob.wakeUp();
}
}
}
};
int maxJobs = getMaterializationContext().getMaxParallelJobs();
int jobs = allJobs.size();
for(int idx = 0; idx < jobs; ++idx)
{
MaterializerJob job = allJobs.poll();
if(job == null)
break;
job.addJobChangeListener(listener);
if(idx < maxJobs)
{
job.schedule();
}
else
{
job.schedule(10); // really don't want to start it now
job.sleep();
jobsToWakeUp.offer(job);
}
}
}
}