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

Extension point for adding actions into build page

上级 7609248d
...@@ -885,25 +885,6 @@ public abstract class AbstractBuild<P extends AbstractProject<P,R>,R extends Abs ...@@ -885,25 +885,6 @@ public abstract class AbstractBuild<P extends AbstractProject<P,R>,R extends Abs
return getTimestamp(); 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(){ public List<Action> getPersistentActions(){
return super.getActions(); return super.getActions();
} }
......
...@@ -243,6 +243,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -243,6 +243,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
*/ */
private volatile transient Runner runner; private volatile transient Runner runner;
protected transient List<Action> transientActions;
protected static final ThreadLocal<SimpleDateFormat> ID_FORMATTER = protected static final ThreadLocal<SimpleDateFormat> ID_FORMATTER =
new ThreadLocal<SimpleDateFormat>() { new ThreadLocal<SimpleDateFormat>() {
@Override @Override
...@@ -272,6 +274,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -272,6 +274,7 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
this.timestamp = timestamp; this.timestamp = timestamp;
this.state = State.NOT_STARTED; this.state = State.NOT_STARTED;
getRootDir().mkdirs(); getRootDir().mkdirs();
transientActions = updateTransientActions();
} }
/** /**
...@@ -304,6 +307,29 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -304,6 +307,29 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
for (Action a : getActions()) for (Action a : getActions())
if (a instanceof RunAction) if (a instanceof RunAction)
((RunAction) a).onLoad(); ((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 @Override
...@@ -2059,11 +2085,17 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -2059,11 +2085,17 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
@Override @Override
public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) { public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) {
Object result = super.getDynamic(token, req, 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) // 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 // 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. // may not have the action.. tell browsers to redirect up to the build page.
result = new RedirectUp(); result = new RedirectUp();
}
return result; return result;
} }
......
...@@ -7,7 +7,7 @@ import jenkins.model.Jenkins; ...@@ -7,7 +7,7 @@ import jenkins.model.Jenkins;
import java.util.Collection; 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. * To register your implementation, put {@link Extension} on your subtype.
* *
...@@ -20,10 +20,10 @@ public abstract class TransientBuildActionFactory implements ExtensionPoint { ...@@ -20,10 +20,10 @@ public abstract class TransientBuildActionFactory implements ExtensionPoint {
/** /**
* Creates actions for the given build. * 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. * @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. * Returns all the registered {@link TransientBuildActionFactory}s.
......
...@@ -33,6 +33,15 @@ THE SOFTWARE. ...@@ -33,6 +33,15 @@ THE SOFTWARE.
<j:set var="buildUrl" value="${h.decompose(request)}" /> <j:set var="buildUrl" value="${h.decompose(request)}" />
<st:include page="tasks.jelly"/> <st:include page="tasks.jelly"/>
<st:include page="actions.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}"> <j:if test="${it.previousBuild!=null}">
<l:task icon="images/24x24/previous.png" href="${buildUrl.previousBuildUrl}" title="${%Previous Build}" contextMenu="false"/> <l:task icon="images/24x24/previous.png" href="${buildUrl.previousBuildUrl}" title="${%Previous Build}" contextMenu="false"/>
</j:if> </j:if>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册