package hudson.plugins.tfs.util;
import java.io.IOException;
import hudson.model.AbstractBuild;
import hudson.model.Node;
import hudson.model.Run;
import hudson.plugins.tfs.model.WorkspaceConfiguration;
/**
* Class for retrieving the latest build configuration for a certain node.
* As the data should be stored together with the workspace, but that is not possible
* today so it is stored in the build itself. Latest build on a certain node always
* contains the SCM configuration for the workspace on that node.
* @author Erik Ramfelt, redsolo
*/
public class BuildWorkspaceConfigurationRetriever {
public BuildWorkspaceConfiguration getLatestForNode(Node needleNode, Run<?,?> latestRun) {
if ((latestRun == null) || !(latestRun instanceof AbstractBuild<?, ?>)) {
return null;
}
AbstractBuild<?, ?> build = (AbstractBuild<?, ?>) latestRun;
while ((build != null) && !build.getBuiltOn().getNodeName().equals(needleNode.getNodeName())) {
build = build.getPreviousBuild();
}
if (build != null) {
WorkspaceConfiguration configuration = build.getAction(WorkspaceConfiguration.class);
if (configuration != null) {
return new BuildWorkspaceConfiguration(configuration, build);
}
}
return null;
}
public static class BuildWorkspaceConfiguration extends WorkspaceConfiguration {
private static final long serialVersionUID = 1L;
private final AbstractBuild<?, ?> build;
public BuildWorkspaceConfiguration(WorkspaceConfiguration configuration, AbstractBuild<?, ?> build) {
super(configuration);
this.build = build;
}
public void save() throws IOException {
if (!workspaceExists()) {
build.getAction(WorkspaceConfiguration.class).setWorkspaceWasRemoved();
}
build.save();
}
}
}