提交 91f80263 编写于 作者: K kohsuke

Extension points can now contribute multiple actions.

git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@25771 71c3de6d-444a-0410-be80-ed276b4c234a
上级 230333df
......@@ -231,26 +231,14 @@ public class MatrixProject extends AbstractProject<MatrixProject,MatrixBuild> im
synchronized(transientActions) {
super.updateTransientActions();
for (BuildStep step : builders) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (BuildStep step : publishers) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (BuildWrapper step : buildWrappers) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (Trigger trigger : triggers) {
Action a = trigger.getProjectAction();
if(a!=null)
transientActions.add(a);
}
for (BuildStep step : builders)
transientActions.addAll(step.getProjectActions(this));
for (BuildStep step : publishers)
transientActions.addAll(step.getProjectActions(this));
for (BuildWrapper step : buildWrappers)
transientActions.addAll(step.getProjectActions(this));
for (Trigger trigger : triggers)
transientActions.addAll(trigger.getProjectActions(this));
}
}
......
......@@ -487,9 +487,7 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
transientActions.clear();
for (JobProperty<? super P> p : properties) {
Action a = p.getJobAction((P)this);
if(a!=null)
transientActions.add(a);
transientActions.addAll(p.getJobActions((P)this));
}
for (TransientProjectActionFactory tpaf : TransientProjectActionFactory.all())
......@@ -830,7 +828,7 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
* <p>
* Note that this method returns a read-only view of {@link Action}s.
* {@link BuildStep}s and others who want to add a project action
* should do so by implementing {@link BuildStep#getProjectAction(AbstractProject)}.
* should do so by implementing {@link BuildStep#getProjectActions(AbstractProject)}.
*
* @see TransientProjectActionFactory
*/
......
......@@ -32,6 +32,8 @@ import hudson.tasks.Publisher;
import hudson.tasks.BuildStepMonitor;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import org.kohsuke.stapler.export.ExportedBean;
......@@ -94,10 +96,18 @@ public abstract class JobProperty<J extends Job<?,?>> implements Describable<Job
}
/**
* {@link Action} to be displayed in the job page.
* @deprecated
* as of 1.341. Override {@link #getJobActions(Job)} instead.
*/
public Action getJobAction(J job) {
return null;
}
/**
* {@link Action}s to be displayed in the job page.
*
* <p>
* Returning non-null from this method allows a job property to add an item
* Returning actions from this method allows a job property to add them
* to the left navigation bar in the job page.
*
* <p>
......@@ -108,13 +118,16 @@ public abstract class JobProperty<J extends Job<?,?>> implements Describable<Job
* Always the same as {@link #owner} but passed in anyway for backward compatibility (I guess.)
* You really need not use this value at all.
* @return
* null if there's no such action.
* can be empty but never null.
* @since 1.102
* @see ProminentProjectAction
* @see PermalinkProjectAction
*/
public Action getJobAction(J job) {
return null;
public Collection<? extends Action> getJobActions(J job) {
// delegate to getJobAction (singular) for backward compatible behavior
Action a = getJobAction(job);
if (a==null) return Collections.emptyList();
return Collections.singletonList(a);
}
//
......@@ -146,4 +159,8 @@ public abstract class JobProperty<J extends Job<?,?>> implements Describable<Job
public final Action getProjectAction(AbstractProject<?,?> project) {
return getJobAction((J)project);
}
public final Collection<? extends Action> getProjectActions(AbstractProject<?,?> project) {
return getJobActions((J)project);
}
}
......@@ -26,6 +26,8 @@ package hudson.model;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.AbstractList;
......@@ -87,8 +89,8 @@ public class ParametersDefinitionProperty extends JobProperty<AbstractProject<?,
}
@Override
public Action getJobAction(AbstractProject<?, ?> job) {
return this;
public Collection<Action> getJobActions(AbstractProject<?, ?> job) {
return Collections.<Action>singleton(this);
}
public AbstractProject<?, ?> getProject() {
......
......@@ -28,7 +28,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
/**
* Optional interface for {@link Action}s that are attached
* to {@link AbstractProject} (through {@link JobProperty#getJobAction(Job)}),
* to {@link AbstractProject} (through {@link JobProperty#getJobActions(Job)}),
* which allows plugins to define additional permalinks in the project.
*
* <p>
......
......@@ -201,26 +201,14 @@ public abstract class Project<P extends Project<P,B>,B extends Build<P,B>>
synchronized(transientActions) {
super.updateTransientActions();
for (BuildStep step : getBuildersList()) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (BuildStep step : getPublishersList()) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (BuildWrapper step : getBuildWrappers().values()) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (Trigger trigger : getTriggers().values()) {
Action a = trigger.getProjectAction();
if(a!=null)
transientActions.add(a);
}
for (BuildStep step : getBuildersList())
transientActions.addAll(step.getProjectActions(this));
for (BuildStep step : getPublishersList())
transientActions.addAll(step.getProjectActions(this));
for (BuildWrapper step : getBuildWrappers().values())
transientActions.addAll(step.getProjectActions(this));
for (Trigger trigger : getTriggers().values())
transientActions.addAll(trigger.getProjectActions(this));
}
}
......
......@@ -35,10 +35,10 @@ import hudson.triggers.Trigger;
* are used to create a large, more visible icon in the top page to draw
* users' attention.
*
* @see BuildStep#getProjectAction(AbstractProject)
* @see BuildWrapper#getProjectAction(AbstractProject)
* @see Trigger#getProjectAction()
* @see JobProperty#getJobAction(Job)
* @see BuildStep#getProjectActions(AbstractProject)
* @see BuildWrapper#getProjectActions(AbstractProject)
* @see Trigger#getProjectActions()
* @see JobProperty#getJobActions(Job)
*
* @author Kohsuke Kawaguchi
*/
......
......@@ -39,6 +39,7 @@ import hudson.model.CheckPoint;
import hudson.model.Run;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.AbstractList;
import java.util.Iterator;
......@@ -101,7 +102,13 @@ public interface BuildStep {
boolean perform(AbstractBuild<?,?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException;
/**
* Returns an action object if this {@link BuildStep} has an action
* @deprecated as of 1.341.
* Use {@link #getProjectActions(AbstractProject)} instead.
*/
Action getProjectAction(AbstractProject<?,?> project);
/**
* Returns action objects if this {@link BuildStep} has actions
* to contribute to a {@link Project}.
*
* <p>
......@@ -119,9 +126,9 @@ public interface BuildStep {
* since {@link BuildStep} object doesn't usually have this "parent" pointer.
*
* @return
* null if there's no action to be contributed.
* can be empty but never null.
*/
Action getProjectAction(AbstractProject<?,?> project);
Collection<? extends Action> getProjectActions(AbstractProject<?,?> project);
/**
......
......@@ -34,6 +34,8 @@ import hudson.model.CheckPoint;
import hudson.Launcher;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Provides compatibility with {@link BuildStep} before 1.150
......@@ -67,6 +69,15 @@ public abstract class BuildStepCompatibilityLayer implements BuildStep {
else
return null;
}
public Collection<? extends Action> getProjectActions(AbstractProject<?, ?> project) {
// delegate to getJobAction (singular) for backward compatible behavior
Action a = getProjectAction(project);
if (a==null) return Collections.emptyList();
return Collections.singletonList(a);
}
//
// old definitions < 1.150
//
......
......@@ -26,7 +26,6 @@ package hudson.tasks;
import hudson.ExtensionPoint;
import hudson.Launcher;
import hudson.DescriptorExtensionList;
import hudson.FileSystemProvisionerDescriptor;
import hudson.LauncherDecorator;
import hudson.model.AbstractBuild;
import hudson.model.Build;
......@@ -40,6 +39,8 @@ import hudson.model.Descriptor;
import hudson.model.Run.RunnerAbortedException;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Pluggability point for performing pre/post actions for the build process.
......@@ -187,11 +188,30 @@ public abstract class BuildWrapper implements ExtensionPoint, Describable<BuildW
* @return
* null if there's no such action.
* @since 1.226
* @deprecated
* Use {@link #getProjectActions(AbstractProject)} instead.
*/
public Action getProjectAction(AbstractProject job) {
return null;
}
/**
* {@link Action}s to be displayed in the job page.
*
* @param job
* This object owns the {@link BuildWrapper}. The returned action will be added to this object.
* @return
* can be empty but never null
* @since 1.341
*/
public Collection<? extends Action> getProjectActions(AbstractProject job) {
// delegate to getJobAction (singular) for backward compatible behavior
Action a = getProjectAction(job);
if (a==null) return Collections.emptyList();
return Collections.singletonList(a);
}
public Descriptor<BuildWrapper> getDescriptor() {
return (Descriptor<BuildWrapper>) Hudson.getInstance().getDescriptorOrDie(getClass());
......
......@@ -34,6 +34,8 @@ import hudson.model.Project;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import java.util.Collection;
/**
* {@link BuildStep}s that perform the actual build.
*
......@@ -56,13 +58,6 @@ public abstract class Builder extends BuildStepCompatibilityLayer implements Bui
return true;
}
/**
* Default implementation that does nothing.
*/
public Action getProjectAction(Project project) {
return null;
}
/**
* Returns {@link BuildStepMonitor#NONE} by default, as {@link Builder}s normally don't depend
* on its previous result.
......
......@@ -40,6 +40,8 @@ import org.kohsuke.stapler.AncestorInPath;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Saves Javadoc for the project and publish them.
......@@ -117,8 +119,8 @@ public class JavadocArchiver extends Recorder {
}
@Override
public Action getProjectAction(AbstractProject project) {
return new JavadocAction(project);
public Collection<Action> getProjectActions(AbstractProject project) {
return Collections.<Action>singleton(new JavadocAction(project));
}
public BuildStepMonitor getRequiredMonitorService() {
......
......@@ -55,6 +55,8 @@ import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import net.sf.json.JSONObject;
......@@ -189,8 +191,8 @@ public class JUnitResultArchiver extends Recorder implements Serializable,
}
@Override
public Action getProjectAction(AbstractProject<?, ?> project) {
return new TestResultProjectAction(project);
public Collection<Action> getProjectActions(AbstractProject<?, ?> project) {
return Collections.<Action>singleton(new TestResultProjectAction(project));
}
public MatrixAggregator createAggregator(MatrixBuild build,
......
......@@ -43,6 +43,8 @@ import org.kohsuke.stapler.DataBoundConstructor;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
......@@ -93,8 +95,8 @@ public class SCMTrigger extends Trigger<SCMedItem> {
}
@Override
public Action getProjectAction() {
return new SCMAction();
public Collection<? extends Action> getProjectActions() {
return Collections.singleton(new SCMAction());
}
/**
......
......@@ -107,11 +107,30 @@ public abstract class Trigger<J extends Item> implements Describable<Trigger<?>>
/**
* Returns an action object if this {@link Trigger} has an action
* to contribute to a {@link Project}.
*
* @deprecated as of 1.341
* Use {@link #getProjectActions()} instead.
*/
public Action getProjectAction() {
return null;
}
/**
* {@link Action}s to be displayed in the job page.
*
* @param job
* This object owns the {@link BuildWrapper}. The returned action will be added to this object.
* @return
* can be empty but never null
* @since 1.341
*/
public Collection<? extends Action> getProjectActions() {
// delegate to getJobAction (singular) for backward compatible behavior
Action a = getProjectAction();
if (a==null) return Collections.emptyList();
return Collections.singletonList(a);
}
public TriggerDescriptor getDescriptor() {
return (TriggerDescriptor)Hudson.getInstance().getDescriptorOrDie(getClass());
}
......
......@@ -72,11 +72,8 @@ public abstract class AbstractMavenProject<P extends AbstractProject<P,R>,R exte
addTransientActionsFromBuild(getLastBuild(),added);
addTransientActionsFromBuild(getLastSuccessfulBuild(),added);
for (Trigger trigger : triggers) {
Action a = trigger.getProjectAction();
if(a!=null)
transientActions.add(a);
}
for (Trigger trigger : triggers)
transientActions.addAll(trigger.getProjectActions());
}
}
......
......@@ -120,7 +120,7 @@ public interface MavenBuildProxy {
/**
* Nominates that the reporter will contribute a project action
* for this build by using {@link MavenReporter#getProjectAction(MavenModule)}.
* for this build by using {@link MavenReporter#getProjectActions(MavenModule)}.
*
* <p>
* The specified {@link MavenReporter} object will be transfered to the master
......
......@@ -413,9 +413,7 @@ public final class MavenModule extends AbstractMavenProject<MavenModule,MavenBui
for (MavenReporter step : list) {
if(!added.add(step.getClass())) continue; // already added
try {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
transientActions.addAll(step.getProjectActions(this));
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Failed to getProjectAction from " + step
+ ". Report issue to plugin developers.", e);
......
......@@ -202,18 +202,12 @@ public final class MavenModuleSet extends AbstractMavenProject<MavenModuleSet,Ma
module.updateTransientActions();
}
if(publishers!=null) // this method can be loaded from within the onLoad method, where this might be null
for (BuildStep step : publishers) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (BuildStep step : publishers)
transientActions.addAll(step.getProjectActions(this));
if (buildWrappers!=null)
for (BuildWrapper step : buildWrappers) {
Action a = step.getProjectAction(this);
if(a!=null)
transientActions.add(a);
}
for (BuildWrapper step : buildWrappers)
transientActions.addAll(step.getProjectActions(this));
}
protected void addTransientActionsFromBuild(MavenModuleSetBuild build, Set<Class> added) {
......
......@@ -40,6 +40,8 @@ import org.apache.maven.reporting.MavenReport;
import java.io.IOException;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
/**
* Listens to the build execution of {@link MavenBuild},
......@@ -261,11 +263,40 @@ public abstract class MavenReporter implements Describable<MavenReporter>, Exten
*
* @return
* null not to contribute an action, which is the default.
* @deprecated as of 1.341
* Use {@link #getProjectActions(MavenModule)} instead.
*/
public Action getProjectAction(MavenModule module) {
return null;
}
/**
* Equivalent of {@link BuildStep#getProjectActions(AbstractProject)}
* for {@link MavenReporter}.
*
* <p>
* Registers a transient action to {@link MavenModule} when it's rendered.
* This is useful if you'd like to display an action at the module level.
*
* <p>
* Since this contributes a transient action, the returned {@link Action}
* will not be serialized.
*
* <p>
* For this method to be invoked, your {@link MavenReporter} has to invoke
* {@link MavenBuildProxy#registerAsProjectAction(MavenReporter)} during the build.
*
* @return
* can be empty but never null.
* @since 1.341
*/
public Collection<? extends Action> getProjectActions(MavenModule module) {
// delegate to getProjectAction (singular) for backward compatible behavior
Action a = getProjectAction(module);
if (a==null) return Collections.emptyList();
return Collections.singletonList(a);
}
/**
* Works like {@link #getProjectAction(MavenModule)} but
* works at {@link MavenModuleSet} level.
......
......@@ -42,6 +42,8 @@ import org.codehaus.plexus.component.configurator.ComponentConfigurationExceptio
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Records the javadoc and archives it.
......@@ -107,8 +109,8 @@ public class MavenJavadocArchiver extends MavenReporter {
return postExecute(build,pom,report,listener,null);
}
public Action getProjectAction(MavenModule project) {
return new JavadocAction(project);
public Collection<? extends Action> getProjectActions(MavenModule project) {
return Collections.singleton(new JavadocAction(project));
}
public Action getAggregatedProjectAction(MavenModuleSet project) {
......
......@@ -43,6 +43,8 @@ import org.codehaus.plexus.component.configurator.ComponentConfigurationExceptio
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Watches out for the execution of maven-site-plugin and records its output.
......@@ -84,8 +86,8 @@ public class MavenSiteArchiver extends MavenReporter {
}
public Action getProjectAction(MavenModule project) {
return new SiteAction(project);
public Collection<? extends Action> getProjectActions(MavenModule project) {
return Collections.singleton(new SiteAction(project));
}
public Action getAggregatedProjectAction(MavenModuleSet project) {
......
......@@ -47,6 +47,8 @@ import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
/**
* Records the surefire test result.
......@@ -122,8 +124,8 @@ public class SurefireArchiver extends MavenReporter {
}
public Action getProjectAction(MavenModule module) {
return new TestResultProjectAction(module);
public Collection<? extends Action> getProjectActions(MavenModule module) {
return Collections.singleton(new TestResultProjectAction(module));
}
private boolean isSurefireTest(MojoInfo mojo) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册