package hudson.plugins.templateproject;
import hudson.Extension;
import hudson.Launcher;
import hudson.matrix.MatrixProject;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Hudson;
import hudson.model.Item;
import hudson.model.Project;
import hudson.security.AccessControlled;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.Builder;
import hudson.tasks.Messages;
import hudson.util.FormValidation;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
public class ProxyBuilder extends Builder {
private final String projectName;
@DataBoundConstructor
public ProxyBuilder(String projectName) {
this.projectName = projectName;
}
public String getProjectName() {
return projectName;
}
public List<Builder> getProjectBuilders() {
AbstractProject p = (AbstractProject) Hudson.getInstance().getItem(projectName);
if (p instanceof Project) return ((Project)p).getBuilders();
else if (p instanceof MatrixProject) return ((MatrixProject)p).getBuilders();
else return Collections.emptyList();
}
@Extension
public static class DescriptorImpl extends BuildStepDescriptor<Builder> {
@Override
public String getDisplayName() {
return "Use builders from another project";
}
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
}
/**
* Form validation method.
*/
public FormValidation doCheckProjectName(@AncestorInPath AccessControlled anc, @QueryParameter String value) {
// Require CONFIGURE permission on this project
if (!anc.hasPermission(Item.CONFIGURE)) return FormValidation.ok();
Item item = Hudson.getInstance().getItemByFullName(
value, Item.class);
if (item == null) {
return FormValidation.error(Messages.BuildTrigger_NoSuchProject(value,
AbstractProject.findNearest(value)
.getName()));
}
if (!(item instanceof Project) && !(item instanceof MatrixProject)) {
return FormValidation.error(Messages.BuildTrigger_NotBuildable(value));
}
return FormValidation.ok();
}
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
for (Builder builder: getProjectBuilders()) {
if (!builder.perform(build, launcher, listener)) {
return false;
}
}
return true;
}
@Override
public boolean prebuild(AbstractBuild<?, ?> build, BuildListener listener) {
for (Builder builder: getProjectBuilders()) {
if (!builder.prebuild(build, listener)) {
return false;
}
}
return true;
}
}