提交 33e0df78 编写于 作者: L lvotypko 提交者: Kohsuke Kawaguchi

Extension point for adding actions into build page

上级 7609248d
......@@ -884,26 +884,7 @@ public abstract class AbstractBuild<P extends AbstractProject<P,R>,R extends Abs
public Calendar due() {
return getTimestamp();
}
/**
* Add all transient action for this build
*
*/
protected List<Action> createTransientActions() {
Vector<Action> ta = new Vector<Action>();
for (TransientBuildActionFactory tpaf : TransientBuildActionFactory.all())
ta.addAll(Util.fixNull(tpaf.createFor(this)));
return ta;
}
// commented out until fixed problem with adding actions, see discussion under https://github.com/jenkinsci/jenkins/pull/421
/* @Override
public List<Action> getActions() {
List<Action> actions = new CopyOnWriteArrayList<Action>(super.getActions());
actions.addAll(createTransientActions());
return actions;
}
*/
public List<Action> getPersistentActions(){
return super.getActions();
}
......
......@@ -242,6 +242,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
* This field is not persisted.
*/
private volatile transient Runner runner;
protected transient List<Action> transientActions;
protected static final ThreadLocal<SimpleDateFormat> ID_FORMATTER =
new ThreadLocal<SimpleDateFormat>() {
......@@ -272,6 +274,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
this.timestamp = timestamp;
this.state = State.NOT_STARTED;
getRootDir().mkdirs();
transientActions = updateTransientActions();
}
/**
......@@ -304,7 +307,30 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
for (Action a : getActions())
if (a instanceof RunAction)
((RunAction) a).onLoad();
transientActions = updateTransientActions();
}
/**
* Return all transient actions associated with this build
*
* @return transient actions
*/
public List<Action> getTransientActions(){
return transientActions;
}
/**
* Create transient actions for this build
*
* @return transient actions
*/
public List<Action> updateTransientActions(){
List<Action> actions = new ArrayList<Action>();
for(TransientBuildActionFactory factory: TransientBuildActionFactory.all()){
actions.addAll(factory.createFor(this));
}
return actions;
}
@Override
public void addAction(Action a) {
......@@ -2059,11 +2085,17 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
@Override
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
Object result = super.getDynamic(token, req, rsp);
if (result == null)
if (result == null){
//check transient actions too
for(Action action: transientActions){
if(action.getUrlName().equals(token))
return action;
}
// Next/Previous Build links on an action page (like /job/Abc/123/testReport)
// will also point to same action (/job/Abc/124/testReport), but other builds
// may not have the action.. tell browsers to redirect up to the build page.
result = new RedirectUp();
}
return result;
}
......
......@@ -7,7 +7,7 @@ import jenkins.model.Jenkins;
import java.util.Collection;
/**
* Extension point for inserting transient {@link Action}s into {@link AbstractBuild}s.
* Extension point for inserting transient {@link Action}s into {@link Run}s.
*
* To register your implementation, put {@link Extension} on your subtype.
*
......@@ -20,10 +20,10 @@ public abstract class TransientBuildActionFactory implements ExtensionPoint {
/**
* Creates actions for the given build.
*
* @param project for which the action objects are requested. Never null.
* @param Build for which the action objects are requested. Never null.
* @return Can be empty but must not be null.
*/
public abstract Collection<? extends Action> createFor(AbstractBuild target);
public abstract Collection<? extends Action> createFor(Run target);
/**
* Returns all the registered {@link TransientBuildActionFactory}s.
......
......@@ -33,6 +33,15 @@ THE SOFTWARE.
<j:set var="buildUrl" value="${h.decompose(request)}" />
<st:include page="tasks.jelly"/>
<st:include page="actions.jelly" />
<!-- add transient actions too -->
<j:forEach var="action" items="${it.transientActions}">
<st:include page="action.jelly" from="${action}" optional="true">
<j:if test="${action.iconFileName!=null}">
<l:task icon="${h.getIconFilePath(action)}" title="${action.displayName}"
href="${h.getActionUrl(it.url,action)}" />
</j:if>
</st:include>
</j:forEach>
<j:if test="${it.previousBuild!=null}">
<l:task icon="images/24x24/previous.png" href="${buildUrl.previousBuildUrl}" title="${%Previous Build}" contextMenu="false"/>
</j:if>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册