Navigation Menu

Skip to content

Commit

Permalink
Consider everything that has triggers as parameter.
Browse files Browse the repository at this point in the history
Take into account not only AbstractProject but everything that implements
ParameterizedJobMixIn.ParameterizedJob.class.

Thus Pipeline jobs will be also considered (see JENKINS-35476)
  • Loading branch information
ialbors-pfc committed Sep 15, 2016
1 parent 1b39dd3 commit f67fb0d
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 27 deletions.
6 changes: 3 additions & 3 deletions src/main/java/hudson/plugins/nextexecutions/NextBuilds.java
Expand Up @@ -2,7 +2,6 @@

import hudson.Extension;
import hudson.model.Describable;
import hudson.model.AbstractProject;
import hudson.model.Descriptor;
import hudson.plugins.nextexecutions.Messages;
import hudson.util.FormValidation;
Expand All @@ -22,18 +21,19 @@
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import hudson.Util;
import jenkins.model.ParameterizedJobMixIn;

/**
* Provides a way to get the project's next execution date.
*
*/
public class NextBuilds implements Comparable, Describable<NextBuilds>{
private AbstractProject project;
private ParameterizedJobMixIn.ParameterizedJob project;
private String name;
private String dateString;
private Calendar date;

public NextBuilds(AbstractProject project, Calendar date) {
public NextBuilds(ParameterizedJobMixIn.ParameterizedJob project, Calendar date) {
this.project = project;
this.name = Util.escape(project.getDisplayName());
this.date = date;
Expand Down
Expand Up @@ -12,7 +12,6 @@
import org.kohsuke.stapler.Stapler;

import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.Queue;
import hudson.model.Queue.Item;
import hudson.model.Queue.WaitingItem;
Expand All @@ -23,6 +22,7 @@
import hudson.triggers.Trigger;
import hudson.triggers.TimerTrigger;
import hudson.widgets.Widget;
import jenkins.model.ParameterizedJobMixIn;

/**
* Widget in the main sidebar with a list
Expand All @@ -47,7 +47,7 @@ public NextExecutionsWidget() {
public List<NextBuilds> getBuilds() {
List<NextBuilds> nblist = new Vector<NextBuilds>();

List<AbstractProject> l;
List<ParameterizedJobMixIn.ParameterizedJob> l;

View v = Stapler.getCurrentRequest().findAncestorObject(View.class);

Expand All @@ -56,20 +56,20 @@ public List<NextBuilds> getBuilds() {
if(d.getFilterByView() && v != null)
{
Collection<TopLevelItem> tli = v.getItems();
Vector<AbstractProject> vector = new Vector<AbstractProject>();
Vector<ParameterizedJobMixIn.ParameterizedJob> vector = new Vector<ParameterizedJobMixIn.ParameterizedJob>();
for (TopLevelItem topLevelItem : tli) {
if(topLevelItem instanceof AbstractProject){
vector.add((AbstractProject)topLevelItem);
if(topLevelItem instanceof ParameterizedJobMixIn.ParameterizedJob){
vector.add((ParameterizedJobMixIn.ParameterizedJob)topLevelItem);
}
}
l = vector;
}
else{
l = Jenkins.getInstance().getItems(AbstractProject.class);
l = Jenkins.getInstance().getItems(ParameterizedJobMixIn.ParameterizedJob.class);
}


for (AbstractProject project: l) {
for (ParameterizedJobMixIn.ParameterizedJob project: l) {
NextBuilds nb = NextExecutionsUtils.getNextBuild(project, triggerClass);
if(nb != null)
nblist.add(nb);
Expand All @@ -82,13 +82,13 @@ public List<NextBuilds> getBuilds() {
if (this.getClass() == NextExecutionsWidget.class) {
Item[] queueItems = Queue.getInstance().getItems();
for (Item item : queueItems) {
if(item instanceof WaitingItem && item.task instanceof AbstractProject) {
if(item instanceof WaitingItem && item.task instanceof ParameterizedJobMixIn.ParameterizedJob) {
WaitingItem waitingItem = (WaitingItem)item;
Calendar now = Calendar.getInstance();
long nowMilliseconds = now.getTimeInMillis();
now.setTimeInMillis(nowMilliseconds + 60 * 1000);
if(waitingItem.timestamp.after(now)) {
NextBuilds nb = new NextBuilds((AbstractProject)item.task, waitingItem.timestamp);
NextBuilds nb = new NextBuilds((ParameterizedJobMixIn.ParameterizedJob)item.task, waitingItem.timestamp);
nblist.add(nb);
}

Expand Down
Expand Up @@ -3,12 +3,12 @@
import org.kohsuke.stapler.DataBoundConstructor;

import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.Job;
import hudson.views.ListViewColumnDescriptor;
import hudson.views.ListViewColumn;
import hudson.plugins.nextexecutions.*;
import hudson.plugins.nextexecutions.utils.NextExecutionsUtils;
import jenkins.model.ParameterizedJobMixIn;

/**
*
Expand All @@ -25,8 +25,8 @@ public NextExecutionColumn() {
}

public String getNextExecution(Job job){
if(job instanceof AbstractProject){
NextBuilds b = NextExecutionsUtils.getNextBuild((AbstractProject)job);
if(job instanceof ParameterizedJobMixIn.ParameterizedJob){
NextBuilds b = NextExecutionsUtils.getNextBuild((ParameterizedJobMixIn.ParameterizedJob)job);
if(b != null)
return b.getDate();
}
Expand Down
@@ -1,17 +1,21 @@
package hudson.plugins.nextexecutions.utils;

import hudson.model.AbstractProject;
import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import hudson.model.AbstractProject;
import hudson.plugins.nextexecutions.NextBuilds;
import hudson.scheduler.CronTab;
import hudson.scheduler.CronTabList;
import hudson.triggers.TimerTrigger;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import java.util.Iterator;
import java.util.Map;
import jenkins.model.ParameterizedJobMixIn;

public class NextExecutionsUtils {

Expand All @@ -21,14 +25,20 @@ public class NextExecutionsUtils {
* @return The {@link NextBuilds} object with the associated
* next execution date or null.
*/
public static NextBuilds getNextBuild(AbstractProject project){
public static NextBuilds getNextBuild(ParameterizedJobMixIn.ParameterizedJob project){
return getNextBuild(project, TimerTrigger.class);
}

public static NextBuilds getNextBuild(AbstractProject project, Class<? extends Trigger> triggerClass){
if(!project.isDisabled()){
Trigger trigger = project.getTrigger(triggerClass);
if(trigger != null){
public static NextBuilds getNextBuild(ParameterizedJobMixIn.ParameterizedJob project, Class<? extends Trigger> triggerClass){
Calendar cal = null;
// Only AbstractProject has isDisabled method
if((project instanceof AbstractProject && !((AbstractProject)project).isDisabled())
|| !(project instanceof AbstractProject)){
Map<TriggerDescriptor,Trigger<?>> triggers = project.getTriggers();
Iterator<Map.Entry<TriggerDescriptor,Trigger<?>>> iterator = triggers.entrySet().iterator();
while(iterator.hasNext()) {
Trigger trigger = iterator.next().getValue();
if(trigger.getClass().equals(triggerClass)) {
try{
Field triggerTabsField = Trigger.class.getDeclaredField("tabs");
triggerTabsField.setAccessible(true);
Expand All @@ -40,23 +50,25 @@ public static NextBuilds getNextBuild(AbstractProject project, Class<? extends T

List<CronTab> crons = (Vector<CronTab>)crontablistTabsField.get(cronTabList);

Calendar cal = null;
for (CronTab cronTab : crons) {
Date d = new Date();
cal = (cal == null || cal.compareTo(cronTab.ceil(d.getTime())) > 0)? cronTab.ceil(d.getTime()) : cal;
}
if(cal != null)
return new NextBuilds(project, cal);
}
catch(NoSuchFieldException e){
e.printStackTrace();
}
catch(IllegalAccessException e){
e.printStackTrace();
}
}
}
}
}
return null;
if(cal != null) {
return new NextBuilds(project, cal);
}
else {
return null;
}
}
}

0 comments on commit f67fb0d

Please sign in to comment.