Skip to content

Commit 3888755

Browse files
authored
Merge pull request #128 from jenkinsci/fix/108
Tooltip shows job parameters
2 parents f6c4d68 + fe68fbc commit 3888755

File tree

10 files changed

+92
-17
lines changed

10 files changed

+92
-17
lines changed

src/main/css/index.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@
128128
border-radius: 8px;
129129
}
130130

131+
.tippy-tooltip.jenkins-theme .parameterBlock {
132+
padding-top:10px;
133+
}
134+
135+
.tippy-tooltip.jenkins-theme .parameters {
136+
padding-left:10px;
137+
}
138+
131139
.tippy-tooltip.jenkins-theme .tooltip-head {
132140
padding: 5px;
133141
background: var(--table-background);

src/main/java/io/jenkins/plugins/view/calendar/event/CalendarEvent.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.kohsuke.accmod.restrictions.NoExternalUse;
3131

3232
import java.util.List;
33+
import java.util.Map;
3334

3435
@Restricted(NoExternalUse.class)
3536
public interface CalendarEvent {
@@ -58,4 +59,6 @@ public interface CalendarEvent {
5859
CalendarEventState getState();
5960

6061
List<StartedCalendarEvent> getLastEvents();
62+
63+
Map<String, String> getParameters();
6164
}

src/main/java/io/jenkins/plugins/view/calendar/event/CalendarEventFactory.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525

2626
import hudson.Util;
2727
import hudson.model.Job;
28+
import hudson.model.ParameterDefinition;
29+
import hudson.model.ParameterValue;
30+
import hudson.model.ParametersDefinitionProperty;
2831
import hudson.model.Run;
2932
import io.jenkins.plugins.view.calendar.CalendarView.CalendarViewEventsType;
3033
import io.jenkins.plugins.view.calendar.service.CalendarEventService;
@@ -39,7 +42,9 @@
3942
import java.util.GregorianCalendar;
4043
import java.util.List;
4144
import java.util.Locale;
45+
import java.util.Map;
4246
import java.util.Objects;
47+
import java.util.TreeMap;
4348

4449
@Restricted(NoExternalUse.class)
4550
public class CalendarEventFactory {
@@ -51,8 +56,8 @@ public CalendarEventFactory(final Moment now, final CalendarEventService calenda
5156
this.calendarEventService = calendarEventService;
5257
}
5358

54-
public ScheduledCalendarEvent createScheduledEvent(final Job job, final Calendar start, final long duration) {
55-
return new ScheduledCalendarEventImpl(job, start, duration);
59+
public ScheduledCalendarEvent createScheduledEvent(final Job job, final Map<String, String> parameters, final Calendar start, final long duration) {
60+
return new ScheduledCalendarEventImpl(job, parameters, start, duration);
5661
}
5762

5863
public StartedCalendarEvent createStartedEvent(final Job job, final Run build) {
@@ -68,6 +73,7 @@ private abstract class CalendarEventImpl implements CalendarEvent {
6873
protected String url;
6974
protected long duration;
7075
private transient List<StartedCalendarEvent> lastEvents;
76+
protected Map<String, String> parameters = new TreeMap<String, String>();
7177

7278
/* default */ final String initId(final String url, final long startTimeInMillis) {
7379
return Objects.requireNonNullElse(url, "")
@@ -152,10 +158,15 @@ public List<StartedCalendarEvent> getLastEvents() {
152158
}
153159
return this.lastEvents;
154160
}
161+
162+
@Override
163+
public Map<String, String> getParameters() {
164+
return this.parameters;
165+
}
155166
}
156167

157168
private class ScheduledCalendarEventImpl extends CalendarEventImpl implements ScheduledCalendarEvent {
158-
public ScheduledCalendarEventImpl(final Job job, final Calendar start, final long durationInMillis) {
169+
public ScheduledCalendarEventImpl(final Job job, final Map<String, String> parameters, final Calendar start, final long durationInMillis) {
159170
super();
160171
this.job = job;
161172
this.id = initId(job.getUrl(), start.getTimeInMillis());
@@ -164,6 +175,19 @@ public ScheduledCalendarEventImpl(final Job job, final Calendar start, final lon
164175
this.duration = durationInMillis;
165176
this.start = new Moment(start);
166177
this.end = initEnd(start.getTimeInMillis(), durationInMillis);
178+
ParametersDefinitionProperty parameterDefinitions = (ParametersDefinitionProperty) this.job.getProperty(ParametersDefinitionProperty.class);
179+
if (parameterDefinitions != null) {
180+
for (ParameterDefinition parameterDefinition : parameterDefinitions.getParameterDefinitions()) {
181+
ParameterValue parameterValue = parameterDefinition.getDefaultParameterValue();
182+
if (parameterValue != null) {
183+
Object value = parameterValue.getValue();
184+
if (value != null) {
185+
this.parameters.put(parameterValue.getName(), value.toString());
186+
}
187+
}
188+
}
189+
}
190+
this.parameters.putAll(parameters);
167191
}
168192

169193
@Override
@@ -201,6 +225,7 @@ public StartedCalendarEventImpl(final Job job, final Run build) {
201225
this.state = CalendarEventState.FINISHED;
202226
}
203227
this.end = initEnd(start.getTimeInMillis(), this.duration);
228+
((List<ParameterValue>) build.getParameterValues()).forEach(parameter -> this.parameters.put(parameter.getName(), parameter.getValue().toString()));
204229
}
205230

206231
@Override

src/main/java/io/jenkins/plugins/view/calendar/service/CalendarEventService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public void collectEvents(final Job job, final CronWrapper<?> cronTab, final lon
138138
next.set(Calendar.SECOND, 0);
139139
next.set(Calendar.MILLISECOND, 0);
140140
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
141-
final ScheduledCalendarEvent event = calendarEventFactory.createScheduledEvent(job, next, estimatedDuration);
141+
final ScheduledCalendarEvent event = calendarEventFactory.createScheduledEvent(job, cronTab.getParameters(), next, estimatedDuration);
142142
if (!event.isInRange(inclusionRange)) {
143143
break;
144144
}
@@ -274,7 +274,7 @@ public ScheduledCalendarEvent getNextScheduledEvent(final CalendarEvent event, f
274274
final Calendar nextStart = cronJobService.getNextStart(job, eventsType);
275275
if (nextStart != null) {
276276
final long estimatedDuration = job.getEstimatedDuration();
277-
return calendarEventFactory.createScheduledEvent(job, nextStart, estimatedDuration);
277+
return calendarEventFactory.createScheduledEvent(job, Collections.emptyMap(), nextStart, estimatedDuration);
278278
}
279279
return null;
280280
}

src/main/java/io/jenkins/plugins/view/calendar/service/CronWrapper.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import io.jenkins.plugins.extended_timer_trigger.CronTabWrapper;
55
import java.time.ZonedDateTime;
66
import java.util.Calendar;
7+
import java.util.Collections;
78
import java.util.GregorianCalendar;
9+
import java.util.Map;
10+
811
import org.jenkinsci.plugins.parameterizedscheduler.ParameterizedCronTab;
912

1013
public abstract class CronWrapper<T> {
1114
public abstract Calendar ceil(long timeInMillis);
1215
public abstract Calendar floor(long timeInMillis);
1316
public abstract T getCronTab();
17+
public abstract Map<String, String> getParameters();
1418

1519
public static class ClassicCronTab extends CronWrapper<CronTab> {
1620
private final CronTab cronTab;
@@ -33,6 +37,11 @@ public Calendar floor(long timeInMillis) {
3337
public CronTab getCronTab() {
3438
return cronTab;
3539
}
40+
41+
@Override
42+
public Map<String, String> getParameters() {
43+
return Collections.emptyMap();
44+
}
3645
}
3746

3847
public static class ParameterizedCronWrapper extends CronWrapper<ParameterizedCronTab> {
@@ -56,6 +65,11 @@ public Calendar floor(long timeInMillis) {
5665
public ParameterizedCronTab getCronTab() {
5766
return cronTab;
5867
}
68+
69+
@Override
70+
public Map<String, String> getParameters() {
71+
return this.cronTab.getParameterValues();
72+
}
5973
}
6074

6175
public static class ExtendedCronTab extends CronWrapper<CronTabWrapper> {
@@ -85,5 +99,10 @@ public Calendar floor(long timeInMillis) {
8599
public CronTabWrapper getCronTab() {
86100
return cronTab;
87101
}
102+
103+
@Override
104+
public Map<String, String> getParameters() {
105+
return this.cronTab.getParameters();
106+
}
88107
}
89108
}

src/main/js/popup.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ function buildInfo(event) {
6363
return $('<div class="tooltip-left"></div>')
6464
.append($('<b></b>').text(CalendarViewOptions.popupText.build))
6565
.append($('<div class="timestamp"></div>').text(event.timestampString))
66-
.append($('<div class="duration"></div>').text(event.durationString));
66+
.append($('<div class="duration"></div>').text(event.durationString))
67+
.append((event.parameters && event.parameters.length > 0) ? parameters(event) : '');
6768
}
6869

6970
function nextScheduledBuild(event, view) {
@@ -91,6 +92,14 @@ function buildHistoryEntries(event, view) {
9192
return event.builds.map(function(b) { return $('<li></li>').append(build(b, view)); });
9293
}
9394

95+
function parameters(event) {
96+
return $('<div class="parameterBlock"></div>')
97+
.append($('<b></b>').text(CalendarViewOptions.popupText.parameters))
98+
.append($('<div class="parameters"></div>')
99+
.append($('<ul></ul>')
100+
.append(event.parameters.map(function(b) { return $('<li></li>').append([b.name, '=', b.value]); }))));
101+
}
102+
94103
function prevAndNextBuild(event, view) {
95104
if (!event.previousStartedBuild && !event.nextStartedBuild) {
96105
return '';

src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/events.jelly

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ THE SOFTWARE.
3838
"duration": ${event.duration},
3939
"state": "${event.state.toString().toLowerCase()}",
4040
"className": "event-result-<j:if test="${event.state == 'FINISHED'}">${event.build.result.toString().toLowerCase()}</j:if><j:if test="${event.state == 'RUNNING'}">${event.job.lastCompletedBuild.result.toString().toLowerCase()}</j:if> event-state-${event.state.toString().toLowerCase()} event-id-${event.id}",
41+
"parameters": [
42+
<j:forEach var="parameter" items="${event.parameters}" varStatus="parameterLoop">
43+
{
44+
"name": "<j:out value="${it.jsonEscape(parameter.key)}"/>",
45+
"value": "<j:out value="${it.jsonEscape(parameter.value)}"/>"
46+
}<j:if test="${!parameterLoop.last}">,</j:if>
47+
</j:forEach>
48+
],
4149
<j:if test="${event.state == 'SCHEDULED' || event.state == 'RUNNING'}">
4250
<j:if test="${event.state == 'SCHEDULED'}">
4351
"timestampString": "<j:out value="${%startsIn(event.timestampString)}"/>",

src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/main.jelly

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ THE SOFTWARE.
4949
"buildHistory": "${%Build History}:",
5050
"buildHistoryEmpty": "${%No past builds}",
5151
"project": "${%Project}: ",
52-
"nextScheduledBuild": "${%Next build}: "
52+
"nextScheduledBuild": "${%Next build}: ",
53+
"parameters": "${%Parameters}:"
5354
},
5455
"names": {
5556
"monthNames": [

src/main/resources/io/jenkins/plugins/view/calendar/CalendarView/main_de.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,4 @@ No\ past\ builds=Keine vergangenen Builds
9090
This\ build=Dieser Build
9191
Project=Projekt
9292
Next\ build=Nächster Build
93+
Parameters=Parameter

src/test/java/io/jenkins/plugins/view/calendar/event/CalendarEventFactoryTest.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
import java.text.ParseException;
4848
import java.util.Calendar;
49+
import java.util.Collections;
4950
import java.util.Locale;
5051
import java.util.Map;
5152
import java.util.TimeZone;
@@ -102,7 +103,7 @@ void testScheduledEvent() throws ParseException {
102103
when(project.getBuildHealth()).thenReturn(health);
103104

104105
Moment now = new Moment();
105-
ScheduledCalendarEvent event = getCalendarEventFactory(now).createScheduledEvent(project, start, duration);
106+
ScheduledCalendarEvent event = getCalendarEventFactory(now).createScheduledEvent(project, Collections.emptyMap(), start, duration);
106107
assertThat(event.getJob(), is(project));
107108
assertThat(event.getTitle(), is("Example Project"));
108109
assertThat(event.getStart(), is(mom(start)));
@@ -148,63 +149,63 @@ void testInRange() throws ParseException {
148149
// MomentRange: | |
149150
// Event: #####
150151
Calendar start1 = cal("2018-01-01 00:00:00 UTC");
151-
CalendarEvent event1 = getCalendarEventFactory(now).createScheduledEvent(item, start1, hours(6));
152+
CalendarEvent event1 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start1, hours(6));
152153
assertThat(event1.getEnd(), is(mom("2018-01-01 06:00:00 UTC")));
153154
assertThat(event1.isInRange(range), is(true));
154155

155156
// MomentRange: | |
156157
// Event: #####
157158
Calendar start2 = cal("2018-01-02 00:00:00 UTC");
158-
CalendarEvent event2 = getCalendarEventFactory(now).createScheduledEvent(item, start2, hours(6));
159+
CalendarEvent event2 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start2, hours(6));
159160
assertThat(event2.getEnd(), is(mom("2018-01-02 06:00:00 UTC")));
160161
assertThat(event2.isInRange(range), is(not(true)));
161162

162163
// MomentRange: | |
163164
// Event: #####
164165
Calendar start3 = cal("2017-12-31 18:00:00 UTC");
165-
CalendarEvent event3 = getCalendarEventFactory(now).createScheduledEvent(item, start3, hours(6));
166+
CalendarEvent event3 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start3, hours(6));
166167
assertThat(event3.getEnd(), is(mom("2018-01-01 00:00:00 UTC")));
167168
assertThat(event3.isInRange(range), is(not(true)));
168169

169170
// MomentRange: | |
170171
// Event: #####
171172
Calendar start4 = cal("2018-01-01 18:00:00 UTC");
172-
CalendarEvent event4 = getCalendarEventFactory(now).createScheduledEvent(item, start4, hours(6));
173+
CalendarEvent event4 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start4, hours(6));
173174
assertThat(event4.getEnd(), is(mom("2018-01-02 00:00:00 UTC")));
174175
assertThat(event4.isInRange(range), is(true));
175176

176177
// MomentRange: | |
177178
// Event: #####
178179
Calendar start5 = cal("2017-12-31 21:00:00 UTC");
179-
CalendarEvent event5 = getCalendarEventFactory(now).createScheduledEvent(item, start5, hours(6));
180+
CalendarEvent event5 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start5, hours(6));
180181
assertThat(event5.getEnd(), is(mom("2018-01-01 03:00:00 UTC")));
181182
assertThat(event5.isInRange(range), is(true));
182183

183184
// MomentRange: | |
184185
// Event: #####
185186
Calendar start6 = cal("2018-01-01 21:00:00 UTC");
186-
CalendarEvent event6 = getCalendarEventFactory(now).createScheduledEvent(item, start6, hours(6));
187+
CalendarEvent event6 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start6, hours(6));
187188
assertThat(event6.getEnd(), is(mom("2018-01-02 03:00:00 UTC")));
188189
assertThat(event6.isInRange(range), is(true));
189190

190191
// MomentRange: | |
191192
// Event: #####
192193
Calendar start7 = cal("2018-01-02 03:00:00 UTC");
193-
CalendarEvent event7 = getCalendarEventFactory(now).createScheduledEvent(item, start7, hours(6));
194+
CalendarEvent event7 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start7, hours(6));
194195
assertThat(event7.getEnd(), is(mom("2018-01-02 09:00:00 UTC")));
195196
assertThat(event7.isInRange(range), is(not(true)));
196197

197198
// MomentRange: | |
198199
// Event: #####
199200
Calendar start8 = cal("2017-12-31 03:00:00 UTC");
200-
CalendarEvent event8 = getCalendarEventFactory(now).createScheduledEvent(item, start8, hours(6));
201+
CalendarEvent event8 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start8, hours(6));
201202
assertThat(event8.getEnd(), is(mom("2017-12-31 09:00:00 UTC")));
202203
assertThat(event8.isInRange(range), is(not(true)));
203204

204205
// MomentRange: | |
205206
// Event: ###############
206207
Calendar start9 = cal("2017-12-31 21:00:00 UTC");
207-
CalendarEvent event9 = getCalendarEventFactory(now).createScheduledEvent(item, start9, hours(30));
208+
CalendarEvent event9 = getCalendarEventFactory(now).createScheduledEvent(item, Collections.emptyMap(), start9, hours(30));
208209
assertThat(event9.getEnd(), is(mom("2018-01-02 03:00:00 UTC")));
209210
assertThat(event9.isInRange(range), is(true));
210211
}

0 commit comments

Comments
 (0)