package hudson.plugins.collabnet.util; import hudson.model.Job; import hudson.model.Run; import hudson.model.TaskListener; import hudson.model.listeners.RunListener; /** * This class will wait for a build to complete for a particular * job and then return to the caller. */ public class BuildCompleteListener <R extends Run> extends RunListener<R> { private Job job = null; private int buildNumber = 0; public BuildCompleteListener(Class<R> targetType, Job job) { this(targetType, job, 0); } public BuildCompleteListener(Class<R> targetType, Job job, int buildNumber) { super(targetType); this.job = job; this.buildNumber = buildNumber; } public void waitForBuildToComplete(int max_wait) { RunListener.all().add(this); synchronized(this) { // check that the build is not already complete Run lastRun = this.job.getLastCompletedBuild(); if (lastRun != null) { int lastNumber = lastRun.getNumber(); if (lastNumber >= this.buildNumber) { return; } } try { this.wait(max_wait); } catch (InterruptedException ie) { return; } } this.unregister(); } @Override public void onCompleted(R r, TaskListener listener) { synchronized(this) { Job j = r.getParent(); if (j == job) { if (r.getNumber() >= this.buildNumber) { this.notify(); } } } } }