Skip to content

Commit c092c3f

Browse files
committed
o Changed the return type to something usefull instead of null. Based on the issue changed several other methods to return something usefull instead of null.
1 parent 36c50c0 commit c092c3f

8 files changed

Lines changed: 180 additions & 41 deletions

File tree

ReleaseNotes.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,34 @@
44

55
### API Changes
66

7+
[Fixed NPE][issue-147]
8+
9+
The JobWithDetails class contains several methods which could
10+
have returned `null`. This has been changed to return non null values.
11+
12+
```java
13+
public List<Job> getDownstreamProjects();
14+
public List<Job> getUpstreamProjects();
15+
```
16+
17+
They will return `Collections.emptyList()`.
18+
19+
The following methods will return `Build.BUILD_HAS_NEVER_RAN` in
20+
cases where no build has executed for the appropriate methods instead
21+
of the previous `null` value.
22+
23+
```java
24+
public Build getFirstBuild();
25+
public Build getLastBuild();
26+
public Build getLastCompletedBuild();
27+
public Build getLastFailedBuild();
28+
public Build getLastStableBuild();
29+
public Build getLastSuccessfulBuild();
30+
public Build getLastUnstableBuild();
31+
public Build getLastUnsuccessfulBuild();
32+
```
33+
34+
735
[Added getAllBuilds(), getAllBuilds(Range range) ][issue-148]
836

937
The `JobWithDetails` has been enhanced with two methods
@@ -374,6 +402,7 @@ TestReport testReport = mavenJob.getLastSuccessfulBuild().getTestReport();
374402
[issue-135]: https://github.com/RisingOak/jenkins-client/issues/135
375403
[issue-144]: https://github.com/RisingOak/jenkins-client/issues/144
376404
[issue-146]: https://github.com/RisingOak/jenkins-client/issues/146
405+
[issue-147]: https://github.com/RisingOak/jenkins-client/issues/147
377406
[issue-148]: https://github.com/RisingOak/jenkins-client/issues/148
378407
[issue-154]: https://github.com/RisingOak/jenkins-client/issues/154
379408
[issue-155]: https://github.com/RisingOak/jenkins-client/issues/155

src/main/java/com/offbytwo/jenkins/model/Build.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,23 @@
1212

1313
public class Build extends BaseModel {
1414

15-
int number;
16-
int queueId;
17-
String url;
15+
/**
16+
* This will be returned by the API in cases where no build has ever
17+
* been executed like {@link JobWithDetails#getLastBuild()} etc.
18+
*/
19+
public static final Build BUILD_HAS_NEVER_RAN = new Build (-1, -1, "UNKNOWN");
20+
21+
private int number;
22+
private int queueId;
23+
private String url;
1824

25+
private Build(int number, int queueId, String url) {
26+
super();
27+
this.number = number;
28+
this.queueId = queueId;
29+
this.url = url;
30+
}
31+
1932
public Build() {
2033
}
2134

src/main/java/com/offbytwo/jenkins/model/BuildWithDetails.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,11 @@ public boolean apply(Map<String, Object> action) {
141141
* in case of a failure.
142142
*/
143143
public String getConsoleOutputText() throws IOException {
144-
return client.get(url + "/logText/progressiveText");
144+
return client.get(getUrl() + "/logText/progressiveText");
145145
}
146146

147147
public String getConsoleOutputHtml() throws IOException {
148-
return client.get(url + "/logText/progressiveHtml");
148+
return client.get(getUrl() + "/logText/progressiveHtml");
149149
}
150150

151151
public BuildChangeSet getChangeSet() {

src/main/java/com/offbytwo/jenkins/model/JobWithDetails.java

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static com.google.common.collect.Lists.transform;
1010

1111
import java.io.IOException;
12+
import java.util.Collections;
1213
import java.util.List;
1314

1415
import org.apache.http.HttpStatus;
@@ -177,48 +178,103 @@ private Build buildWithClient(Build from) {
177178
return ret;
178179
}
179180

181+
/**
182+
* @return the first build which has been executed or
183+
* {@link Build#BUILD_HAS_NEVER_RAN} is this has never
184+
* been executed.
185+
*/
180186
public Build getFirstBuild() {
181-
return buildWithClient(firstBuild);
187+
if (firstBuild == null) {
188+
return Build.BUILD_HAS_NEVER_RAN;
189+
} else {
190+
return buildWithClient(firstBuild);
191+
}
182192
}
183193

184194
public Build getLastBuild() {
185-
return buildWithClient(lastBuild);
195+
if (lastBuild == null) {
196+
return Build.BUILD_HAS_NEVER_RAN;
197+
} else {
198+
return buildWithClient(lastBuild);
199+
}
186200
}
187201

188202
public Build getLastCompletedBuild() {
189-
return buildWithClient(lastCompletedBuild);
203+
if (lastCompletedBuild == null) {
204+
return Build.BUILD_HAS_NEVER_RAN;
205+
} else {
206+
return buildWithClient(lastCompletedBuild);
207+
}
190208
}
191209

192210
public Build getLastFailedBuild() {
193-
return buildWithClient(lastFailedBuild);
211+
if (lastFailedBuild == null) {
212+
return Build.BUILD_HAS_NEVER_RAN;
213+
} else {
214+
return buildWithClient(lastFailedBuild);
215+
}
194216
}
195217

196218
public Build getLastStableBuild() {
197-
return buildWithClient(lastStableBuild);
219+
if (lastStableBuild == null) {
220+
return Build.BUILD_HAS_NEVER_RAN;
221+
} else {
222+
return buildWithClient(lastStableBuild);
223+
}
198224
}
199225

200226
public Build getLastSuccessfulBuild() {
201-
return buildWithClient(lastSuccessfulBuild);
227+
if (lastSuccessfulBuild == null) {
228+
return Build.BUILD_HAS_NEVER_RAN;
229+
} else {
230+
return buildWithClient(lastSuccessfulBuild);
231+
}
202232
}
203233

204234
public Build getLastUnstableBuild() {
205-
return buildWithClient(lastUnstableBuild);
235+
if (lastUnstableBuild == null) {
236+
return Build.BUILD_HAS_NEVER_RAN;
237+
} else {
238+
return buildWithClient(lastUnstableBuild);
239+
}
206240
}
207241

208242
public Build getLastUnsuccessfulBuild() {
209-
return buildWithClient(lastUnsuccessfulBuild);
243+
if (lastUnsuccessfulBuild == null) {
244+
return Build.BUILD_HAS_NEVER_RAN;
245+
} else {
246+
return buildWithClient(lastUnsuccessfulBuild);
247+
}
210248
}
211249

212250
public int getNextBuildNumber() {
213251
return nextBuildNumber;
214252
}
215253

254+
/**
255+
* @return the list of downstream projects.
256+
* If no downstream projects exist just return
257+
* an {@link Collections#emptyList()}
258+
*/
216259
public List<Job> getDownstreamProjects() {
217-
return transform(downstreamProjects, new JobWithClient());
260+
if (downstreamProjects == null) {
261+
return Collections.emptyList();
262+
} else {
263+
return transform(downstreamProjects, new JobWithClient());
264+
}
218265
}
219266

267+
/**
268+
* @return the list of upstream projects.
269+
* If no upstream projects exist just return
270+
* an {@link Collections#emptyList()}
271+
*/
220272
public List<Job> getUpstreamProjects() {
221-
return transform(upstreamProjects, new JobWithClient());
273+
if (upstreamProjects == null) {
274+
return Collections.emptyList();
275+
} else {
276+
return transform(upstreamProjects, new JobWithClient());
277+
}
222278
}
223279

224280
public QueueItem getQueueItem() {

src/main/java/com/offbytwo/jenkins/model/MavenBuild.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ public MavenBuild(int number, String url) {
1616
}
1717

1818
public MavenModule getMavenModule() throws IOException {
19-
return client.get(this.url + "/mavenArtifacts/", MavenModule.class);
19+
return client.get(this.getUrl() + "/mavenArtifacts/", MavenModule.class);
2020
}
2121

2222
public TestReport getTestReport() throws IOException {
23-
return client.get(this.url + "/testReport/?depth=1", TestReport.class);
23+
return client.get(this.getUrl() + "/testReport/?depth=1", TestReport.class);
2424
}
2525
}

src/test/java/com/offbytwo/jenkins/integration/BuildWithDetailsIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.offbytwo.jenkins.integration;
22

3+
import static org.assertj.core.api.Assertions.assertThat;
34
import static org.junit.Assert.assertEquals;
45
import static org.junit.Assert.assertNotNull;
56

@@ -52,7 +53,7 @@ public void checkCauses() throws Exception {
5253
List<BuildCause> causes = build.getCauses();
5354
assertNotNull(causes);
5455

55-
assertEquals("", build.getBuiltOn());
56+
assertThat(build.getBuiltOn()).isEmpty();
5657
}
5758

5859
}
Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,71 @@
11
package com.offbytwo.jenkins.model;
22

3-
import org.junit.Test;
3+
import static org.assertj.core.api.Assertions.assertThat;
44

5-
import static org.junit.Assert.assertNull;
5+
import java.util.Collections;
66

7-
public class JobWithDetailsTest {
7+
import org.junit.Before;
8+
import org.junit.Test;
89

9-
@Test
10-
public void shouldReturnNullBuildsIfJobWithDetailsDoesntHaveAnyBuildsYet() {
11-
// given
12-
JobWithDetails job = givenNewJobWithoutAnyBuilds();
10+
public class JobWithDetailsTest {
1311

14-
// when
15-
Build lastBuild = job.getLastBuild();
16-
Build lastCompletedBuild = job.getLastCompletedBuild();
17-
Build lastFailedBuild = job.getLastFailedBuild();
18-
Build lastStableBuild = job.getLastStableBuild();
19-
Build lastSuccessfulBuild = job.getLastSuccessfulBuild();
20-
Build lastUnstableBuild = job.getLastUnstableBuild();
21-
Build lastUnsuccessfulBuild = job.getLastUnsuccessfulBuild();
12+
private JobWithDetails job;
2213

23-
// then
24-
assertNull(lastBuild);
25-
assertNull(lastCompletedBuild);
26-
assertNull(lastFailedBuild);
27-
assertNull(lastStableBuild);
28-
assertNull(lastSuccessfulBuild);
29-
assertNull(lastUnstableBuild);
30-
assertNull(lastUnsuccessfulBuild);
14+
@Before
15+
public void setUp() {
16+
job = givenNewJobWithoutAnyBuilds();
3117
}
3218

3319
private JobWithDetails givenNewJobWithoutAnyBuilds() {
3420
return new JobWithDetails();
3521
}
22+
23+
private void failIfNotBuildHasNeverRanReturned(Build build) {
24+
assertThat(build).isEqualTo(Build.BUILD_HAS_NEVER_RAN);
25+
}
26+
27+
@Test
28+
public void getLastStableBuildShouldReturnBuildHasNeverRan() {
29+
failIfNotBuildHasNeverRanReturned(job.getLastStableBuild());
30+
}
31+
32+
@Test
33+
public void getLastBuildShouldReturnBuildHasNeverRan() {
34+
failIfNotBuildHasNeverRanReturned(job.getLastBuild());
35+
}
36+
37+
@Test
38+
public void getLastCompletedBuildShouldReturnBuildHasNeverRan() {
39+
failIfNotBuildHasNeverRanReturned(job.getLastCompletedBuild());
40+
}
41+
42+
@Test
43+
public void getLastFailedBuildShouldReturnBuildHasNeverRan() {
44+
failIfNotBuildHasNeverRanReturned(job.getLastFailedBuild());
45+
}
46+
47+
@Test
48+
public void getLastSuccessfulBuildShouldReturnBuildHasNeverRan() {
49+
failIfNotBuildHasNeverRanReturned(job.getLastSuccessfulBuild());
50+
}
51+
52+
@Test
53+
public void getLastUnstableBuildShouldReturnBuildHasNeverRan() {
54+
failIfNotBuildHasNeverRanReturned(job.getLastUnstableBuild());
55+
}
56+
57+
@Test
58+
public void getLastUnsuccessfulBuildShouldReturnBuildHasNeverRan() {
59+
failIfNotBuildHasNeverRanReturned(job.getLastUnsuccessfulBuild());
60+
}
61+
62+
@Test
63+
public void getDownstreamProjectsShouldReturnEmptyList() {
64+
assertThat(job.getDownstreamProjects()).isEqualTo(Collections.emptyList());
65+
}
66+
67+
@Test
68+
public void getUpstreamProjectsShouldReturnEmptyList() {
69+
assertThat(job.getUpstreamProjects()).isEqualTo(Collections.emptyList());
70+
}
3671
}

x.diff

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Fixed #147
2+
o Changed the return type to something usefull
3+
instead of null.
4+
Based on the issue changed several other methods
5+
to return something usefull instead of null.

0 commit comments

Comments
 (0)