提交 cf25766b 编写于 作者: K kohsuke

converted Builder to support auto-registration.

git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@15617 71c3de6d-444a-0410-be80-ed276b4c234a
上级 23e2dcbe
......@@ -601,7 +601,7 @@ public class Functions {
}
public static List<Descriptor<Builder>> getBuilderDescriptors(AbstractProject<?,?> project) {
return BuildStepDescriptor.filter(BuildStep.BUILDERS, project.getClass());
return BuildStepDescriptor.filter(Builder.all(), project.getClass());
}
public static List<Descriptor<Publisher>> getPublisherDescriptors(AbstractProject<?,?> project) {
......
......@@ -534,7 +534,7 @@ public class MatrixProject extends AbstractProject<MatrixProject,MatrixBuild> im
JSONObject json = req.getSubmittedForm();
buildWrappers.rebuild(req, json, BuildWrappers.getFor(this));
builders.rebuildHetero(req, json, BuildStep.BUILDERS, "builder");
builders.rebuildHetero(req, json, Builder.all(), "builder");
publishers.rebuild(req, json, BuildStepDescriptor.filter(BuildStep.PUBLISHERS,this.getClass()));
updateTransientActions(); // to pick up transient actions from builder, publisher, etc.
......
......@@ -639,7 +639,7 @@ public final class Hudson extends Node implements ItemGroup<TopLevelItem>, Stapl
* Gets the builder descriptor by name. Primarily used for making them web-visible.
*/
public Descriptor<Builder> getBuilder(String shortClassName) {
return findDescriptor(shortClassName, BuildStep.BUILDERS);
return findDescriptor(shortClassName, Builder.all());
}
/**
......@@ -2023,7 +2023,7 @@ public final class Hudson extends Node implements ItemGroup<TopLevelItem>, Stapl
boolean result = true;
for( Descriptor<Builder> d : BuildStep.BUILDERS )
for( Descriptor<Builder> d : Builder.all() )
result &= configureDescriptor(req,json,d);
for( Descriptor<Publisher> d : BuildStep.PUBLISHERS )
......
......@@ -186,7 +186,7 @@ public abstract class Project<P extends Project<P,B>,B extends Build<P,B>>
JSONObject json = req.getSubmittedForm();
buildWrappers.rebuild(req,json, BuildWrappers.getFor(this));
builders.rebuildHetero(req,json, BuildStep.BUILDERS, "builder");
builders.rebuildHetero(req,json, Builder.all(), "builder");
publishers.rebuild(req, json, BuildStepDescriptor.filter(BuildStep.PUBLISHERS, this.getClass()));
updateTransientActions(); // to pick up transient actions from builder, publisher, etc.
}
......
......@@ -28,12 +28,12 @@ import hudson.EnvVars;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Util;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.EnvironmentSpecific;
import hudson.model.ParametersAction;
import hudson.model.TaskListener;
import hudson.remoting.Callable;
import hudson.util.ArgumentListBuilder;
......@@ -110,7 +110,7 @@ public class Ant extends Builder {
* or null to invoke the default one.
*/
public AntInstallation getAnt() {
for( AntInstallation i : DESCRIPTOR.getInstallations() ) {
for( AntInstallation i : getDescriptor().getInstallations() ) {
if(antName!=null && i.getName().equals(antName))
return i;
}
......@@ -213,7 +213,7 @@ public class Ant extends Builder {
String errorMessage = Messages.Ant_ExecFailed();
if(ai==null && (System.currentTimeMillis()-startTime)<1000) {
if(DESCRIPTOR.getInstallations()==null)
if(getDescriptor().getInstallations()==null)
// looks like the user didn't configure any Ant installation
errorMessage += Messages.Ant_GlobalConfigNeeded();
else
......@@ -238,17 +238,16 @@ public class Ant extends Builder {
return base.child("build.xml");
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
public DescriptorImpl getDescriptor() {
return (DescriptorImpl)super.getDescriptor();
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static class DescriptorImpl extends Descriptor<Builder> {
@CopyOnWrite
private volatile AntInstallation[] installations = new AntInstallation[0];
private DescriptorImpl() {
public DescriptorImpl() {
load();
}
......
......@@ -24,6 +24,7 @@
package hudson.tasks;
import hudson.FilePath;
import hudson.Extension;
import hudson.model.Descriptor;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
......@@ -50,12 +51,7 @@ public class BatchFile extends CommandInterpreter {
return ".bat";
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static final class DescriptorImpl extends Descriptor<Builder> {
public String getHelpFile() {
return "/help/project-config/batch.html";
......
......@@ -24,6 +24,8 @@
package hudson.tasks;
import hudson.Launcher;
import hudson.Extension;
import hudson.util.DescriptorList;
import hudson.maven.RedeployPublisher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
......@@ -123,13 +125,12 @@ public interface BuildStep {
* List of all installed builders.
*
* Builders are invoked to perform the build itself.
*
* @deprecated as of 1.286.
* Use {@link Builder#all()} for read access, and use
* {@link Extension} for registration.
*/
public static final List<Descriptor<Builder>> BUILDERS = Descriptor.toList(
Shell.DESCRIPTOR,
BatchFile.DESCRIPTOR,
Ant.DESCRIPTOR,
Maven.DESCRIPTOR
);
public static final List<Descriptor<Builder>> BUILDERS = new DescriptorList<Builder>(Builder.class);
/**
* List of all installed publishers.
......
......@@ -29,6 +29,7 @@ import hudson.model.AbstractProject;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
/**
* {@link Descriptor} for {@link Builder} and {@link Publisher}.
......@@ -65,9 +66,20 @@ public abstract class BuildStepDescriptor<T extends BuildStep & Describable<T>>
/**
* Fiters a descriptor for {@link BuildStep}s by using {@link BuildStepDescriptor#isApplicable(Class)}.
*
* @deprecated as of 1.286.
* Use the {@link Collection} version which is more general.
*/
public static <T extends BuildStep&Describable<T>>
List<Descriptor<T>> filter(List<Descriptor<T>> base, Class<? extends AbstractProject> type) {
return filter((Collection<Descriptor<T>>)base,type);
}
/**
* Fiters a descriptor for {@link BuildStep}s by using {@link BuildStepDescriptor#isApplicable(Class)}.
*/
public static <T extends BuildStep&Describable<T>>
List<Descriptor<T>> filter(Collection<? extends Descriptor<T>> base, Class<? extends AbstractProject> type) {
List<Descriptor<T>> r = new ArrayList<Descriptor<T>>(base.size());
for (Descriptor<T> d : base) {
if (d instanceof BuildStepDescriptor) {
......
......@@ -25,6 +25,7 @@ package hudson.tasks;
import hudson.ExtensionPoint;
import hudson.Launcher;
import hudson.DescriptorExtensionList;
import hudson.model.AbstractBuild;
import hudson.model.Build;
import hudson.model.BuildListener;
......@@ -32,12 +33,10 @@ import hudson.model.Describable;
import hudson.model.Project;
import hudson.model.Action;
import hudson.model.AbstractProject;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.Run.RunnerAbortedException;
import java.io.IOException;
import java.util.Collection;
/**
* Pluggability point for performing pre/post actions for the build process.
......@@ -188,7 +187,7 @@ public abstract class BuildWrapper implements ExtensionPoint, Describable<BuildW
/**
* Returns all the registered {@link BuildWrapper} descriptors.
*/
public static Collection<Descriptor<BuildWrapper>> all() {
public static DescriptorExtensionList<BuildWrapper> all() {
// use getDescriptorList and not getExtensionList to pick up legacy instances
return Hudson.getInstance().getDescriptorList(BuildWrapper.class);
}
......
......@@ -24,18 +24,22 @@
package hudson.tasks;
import hudson.ExtensionPoint;
import hudson.Extension;
import hudson.DescriptorExtensionList;
import hudson.model.Action;
import hudson.model.Build;
import hudson.model.BuildListener;
import hudson.model.Describable;
import hudson.model.Project;
import hudson.model.Descriptor;
import hudson.model.Hudson;
/**
* {@link BuildStep}s that perform the actual build.
*
* <p>
* To register a custom {@link Builder} from a plugin,
* add it to {@link BuildStep#BUILDERS}.
* put {@link Extension} on your descriptor.
*
* @author Kohsuke Kawaguchi
*/
......@@ -58,4 +62,16 @@ public abstract class Builder extends BuildStepCompatibilityLayer implements Bui
public Action getProjectAction(Project project) {
return null;
}
public Descriptor<Builder> getDescriptor() {
return Hudson.getInstance().getDescriptor(getClass());
}
/**
* Returns all the registered {@link Builder} descriptors.
*/
public static DescriptorExtensionList<Builder> all() {
return Hudson.getInstance().getDescriptorList(Builder.class);
}
}
......@@ -30,6 +30,7 @@ import hudson.Launcher;
import hudson.Launcher.LocalLauncher;
import hudson.Util;
import hudson.EnvVars;
import hudson.Extension;
import hudson.maven.MavenEmbedder;
import hudson.maven.MavenUtil;
import hudson.maven.RedeployPublisher;
......@@ -38,7 +39,6 @@ import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.EnvironmentSpecific;
import hudson.model.ParametersAction;
import hudson.remoting.Callable;
import hudson.remoting.VirtualChannel;
import hudson.util.ArgumentListBuilder;
......@@ -119,7 +119,7 @@ public class Maven extends Builder {
* or null to invoke the default one.
*/
public MavenInstallation getMaven() {
for( MavenInstallation i : DESCRIPTOR.getInstallations() ) {
for( MavenInstallation i : getDescriptor().getInstallations() ) {
if(mavenName !=null && i.getName().equals(mavenName))
return i;
}
......@@ -255,21 +255,19 @@ public class Maven extends Builder {
return true;
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
public DescriptorImpl getDescriptor() {
return (DescriptorImpl)super.getDescriptor();
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static final class DescriptorImpl extends Descriptor<Builder> {
@CopyOnWrite
private volatile MavenInstallation[] installations = new MavenInstallation[0];
private DescriptorImpl() {
public DescriptorImpl() {
load();
}
protected void convert(Map<String, Object> oldPropertyBag) {
if(oldPropertyBag.containsKey("installations"))
installations = (MavenInstallation[]) oldPropertyBag.get("installations");
......
......@@ -25,6 +25,7 @@ package hudson.tasks;
import hudson.FilePath;
import hudson.Util;
import hudson.Extension;
import hudson.model.Descriptor;
import static hudson.model.Hudson.isWindows;
import hudson.util.FormFieldValidator;
......@@ -82,7 +83,7 @@ public class Shell extends CommandInterpreter {
args.set(0,args.get(0).substring(2)); // trim off "#!"
return args.toArray(new String[args.size()]);
} else
return new String[] { DESCRIPTOR.getShellOrDefault(),"-xe",script.getRemote()};
return new String[] { getDescriptor().getShellOrDefault(),"-xe",script.getRemote()};
}
protected String getContents() {
......@@ -93,19 +94,18 @@ public class Shell extends CommandInterpreter {
return ".sh";
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
public DescriptorImpl getDescriptor() {
return (DescriptorImpl)super.getDescriptor();
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static final class DescriptorImpl extends Descriptor<Builder> {
/**
* Shell executable, or null to default.
*/
private String shell;
private DescriptorImpl() {
public DescriptorImpl() {
load();
}
......
package org.jvnet.hudson.test;
import hudson.Launcher;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.Result;
import hudson.tasks.Builder;
import hudson.tasks.BuildStep;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
......@@ -31,12 +30,7 @@ public class CaptureEnvironmentBuilder extends Builder {
return true;
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static final class DescriptorImpl extends Descriptor<Builder> {
public Builder newInstance(StaplerRequest req, JSONObject data) {
throw new UnsupportedOperationException();
......@@ -46,8 +40,4 @@ public class CaptureEnvironmentBuilder extends Builder {
return "Capture Environment Variables";
}
}
static {
BuildStep.BUILDERS.add(DESCRIPTOR);
}
}
......@@ -24,12 +24,12 @@
package org.jvnet.hudson.test;
import hudson.Launcher;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.Result;
import hudson.tasks.Builder;
import hudson.tasks.BuildStep;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
......@@ -47,12 +47,7 @@ public class FailureBuilder extends Builder {
return false;
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static final class DescriptorImpl extends Descriptor<Builder> {
public Builder newInstance(StaplerRequest req, JSONObject data) {
throw new UnsupportedOperationException();
......@@ -62,8 +57,4 @@ public class FailureBuilder extends Builder {
return "Always fail";
}
}
static {
BuildStep.BUILDERS.add(DESCRIPTOR);
}
}
......@@ -24,10 +24,10 @@
package org.jvnet.hudson.test;
import hudson.Launcher;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.tasks.BuildStep;
import hudson.tasks.Builder;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
......@@ -52,12 +52,7 @@ public class SleepBuilder extends Builder {
return true;
}
public Descriptor<Builder> getDescriptor() {
return DESCRIPTOR;
}
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
@Extension
public static final class DescriptorImpl extends Descriptor<Builder> {
public Builder newInstance(StaplerRequest req, JSONObject data) {
throw new UnsupportedOperationException();
......@@ -67,8 +62,4 @@ public class SleepBuilder extends Builder {
return "Sleep";
}
}
static {
BuildStep.BUILDERS.add(DESCRIPTOR);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册