diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 5e8b7277a674c344efe241fd2ec06dd923ab1c1a..95e9668afa2883f6a38441c2d6818d40cc56816a 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -401,7 +401,7 @@ public abstract class AbstractProject

,R extends A * If this project is configured to be always built on this node, * return that {@link Node}. Otherwise null. */ - public Label getAssignedLabel() { + public @CheckForNull Label getAssignedLabel() { if(canRoam) return null; diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 0b54d40a8ec4e40e5d5a2b8e30421f4f3378ffb9..860b9b77b99a90944b947a9529f2ff06b6e3a1b8 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -448,7 +448,7 @@ public abstract class View extends AbstractModelObject implements AccessControll if (labels.contains(null) && node.getMode() == Mode.NORMAL) return true; for (Label l : labels) - if (l.contains(node)) + if (l != null && l.contains(node)) return true; return false; } diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index 69806cd4196c47762cd1a911415b261530251b41..ac3f3a5c6e67a0a9c64aaf87b7b55464daf2f591 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -38,11 +38,13 @@ import hudson.matrix.AxisList; import hudson.matrix.LabelAxis; import hudson.matrix.MatrixProject; import hudson.model.Queue.Task; +import hudson.model.Node.Mode; import org.jvnet.hudson.test.Email; import org.w3c.dom.Text; import static hudson.model.Messages.Hudson_ViewName; +import hudson.slaves.DumbSlave; import hudson.util.HudsonIsLoading; import java.io.File; import java.io.IOException; @@ -301,6 +303,27 @@ public class ViewTest { assertContainsNodes(view3, slave0, slave1, slave2, slave3, slave4); } + @Test + @Bug(21474) + public void testGetComputersNPE() throws Exception { + ListView view = listView("aView"); + view.filterExecutors = true; + + DumbSlave dedicatedSlave = j.createOnlineSlave(); + dedicatedSlave.setMode(Mode.EXCLUSIVE); + view.add(j.createFreeStyleProject()); + + FreeStyleProject tiedJob = j.createFreeStyleProject(); + tiedJob.setAssignedNode(dedicatedSlave); + view.add(tiedJob); + + DumbSlave notIncludedSlave = j.createOnlineSlave(); + notIncludedSlave.setMode(Mode.EXCLUSIVE); + + assertContainsNodes(view, j.jenkins, dedicatedSlave); + assertNotContainsNodes(view, notIncludedSlave); + } + private void assertContainsNodes(View view, Node... slaves) { for (Node slave: slaves) { assertTrue(