package hudson.plugins.batch_task; import hudson.Extension; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Job; import hudson.model.JobProperty; import hudson.model.JobPropertyDescriptor; import hudson.util.EditDistance; import net.sf.json.JSONObject; import org.kohsuke.stapler.StaplerRequest; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.io.IOException; /** * Batch tasks added as {@link JobProperty}. * * @author Kohsuke Kawaguchi */ public class BatchTaskProperty extends JobProperty<AbstractProject<?,?>> { private volatile BatchTask[] tasks; public BatchTaskProperty(BatchTask... tasks) { this.tasks = tasks; } public BatchTaskProperty(Collection<BatchTask> tasks) { this((BatchTask[])tasks.toArray(new BatchTask[tasks.size()])); } @Override protected void setOwner(AbstractProject<?, ?> owner) { super.setOwner(owner); for (BatchTask t : tasks) { t.owner = owner; t.parent = this; } } public AbstractProject<?,?> getOwner() { return owner; } public BatchTask getTask(String name) { for (BatchTask t : tasks) if(t.name.equals(name)) return t; return null; } public List<BatchTask> getTasks() { return Collections.unmodifiableList(Arrays.asList(tasks)); } public synchronized void removeTask(BatchTask t) throws IOException { ArrayList<BatchTask> l = new ArrayList<BatchTask>(Arrays.asList(tasks)); if(l.remove(t)) { tasks = l.toArray(new BatchTask[l.size()]); getOwner().save(); } } /** * Finds the {@link BatchTask} that has the closest name. Used for error diagnostics. */ public BatchTask findNearestTask(String name) { String[] names = new String[tasks.length]; for (int i = 0; i < tasks.length; i++) names[i] = tasks[i].name; name = EditDistance.findNearest(name,names); return getTask(name); } @Override public Collection<? extends Action> getJobActions(AbstractProject<?,?> job) { return Collections.singletonList(new BatchTaskAction(job, this)); } @Override public DescriptorImpl getDescriptor() { return DESCRIPTOR; } @Extension public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); public static final class DescriptorImpl extends JobPropertyDescriptor { public DescriptorImpl() { super(BatchTaskProperty.class); load(); } @Override public boolean isApplicable(Class<? extends Job> jobType) { return AbstractProject.class.isAssignableFrom(jobType); } public String getDisplayName() { return Messages.BatchTaskProperty_DisplayName(); } @Override public BatchTaskProperty newInstance(StaplerRequest req, JSONObject formData) throws FormException { if(req.getParameter("batch-tasks.on")!=null) return new BatchTaskProperty(req.bindParametersToList(BatchTask.class, "batch-task.")); else return null; } } }