From 016f304c491958dac4163939b1655cf38231a1b2 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 May 2014 14:02:26 -0400 Subject: [PATCH] Better null safety. In 1.509.2, probably due to a bad Groovy script: java.lang.ClassCastException: hudson.model.Hudson cannot be cast to hudson.model.Slave at hudson.slaves.SlaveComputer.getNode(SlaveComputer.java:176) at hudson.slaves.SlaveComputer.getNode(SlaveComputer.java:92) at jenkins.model.Jenkins$9.compare(Jenkins.java:1547) at jenkins.model.Jenkins$9.compare(Jenkins.java:1543) at java.util.Arrays.mergeSort(Arrays.java:1270) at java.util.Arrays.mergeSort(Arrays.java:1282) at java.util.Arrays.mergeSort(Arrays.java:1282) at java.util.Arrays.mergeSort(Arrays.java:1282) at java.util.Arrays.mergeSort(Arrays.java:1282) at java.util.Arrays.mergeSort(Arrays.java:1282) at java.util.Arrays.mergeSort(Arrays.java:1282) at java.util.Arrays.sort(Arrays.java:1210) at jenkins.model.Jenkins.getComputers(Jenkins.java:1543) --- core/src/main/java/hudson/model/Computer.java | 2 +- core/src/main/java/hudson/model/Node.java | 2 +- core/src/main/java/hudson/model/Slave.java | 4 ++-- core/src/main/java/hudson/slaves/SlaveComputer.java | 8 +++++++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 6511305176..d47ec82447 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -457,7 +457,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * Returns {@link Node#getNodeName() the name of the node}. */ public @Nonnull String getName() { - return nodeName; + return nodeName != null ? nodeName : ""; } /** diff --git a/core/src/main/java/hudson/model/Node.java b/core/src/main/java/hudson/model/Node.java index d5974aa189..fe9fbe0841 100644 --- a/core/src/main/java/hudson/model/Node.java +++ b/core/src/main/java/hudson/model/Node.java @@ -117,7 +117,7 @@ public abstract class Node extends AbstractModelObject implements Reconfigurable * "" if this is master */ @Exported(visibility=999) - public abstract String getNodeName(); + public abstract @Nonnull String getNodeName(); /** * When the user clones a {@link Node}, Hudson uses this method to change the node name right after diff --git a/core/src/main/java/hudson/model/Slave.java b/core/src/main/java/hudson/model/Slave.java index e52a6f8af5..d29ed99a13 100644 --- a/core/src/main/java/hudson/model/Slave.java +++ b/core/src/main/java/hudson/model/Slave.java @@ -56,8 +56,8 @@ import java.util.Set; import javax.servlet.ServletException; -import hudson.util.TimeUnit2; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import jenkins.model.Jenkins; import jenkins.slaves.WorkspaceLocator; @@ -149,7 +149,7 @@ public abstract class Slave extends Node implements Serializable { this(name, nodeDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, new ArrayList()); } - public Slave(String name, String nodeDescription, String remoteFS, int numExecutors, + public Slave(@Nonnull String name, String nodeDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, List> nodeProperties) throws FormException, IOException { this.name = name; this.description = nodeDescription; diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index ea78e80331..3a73b99829 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -170,7 +170,13 @@ public class SlaveComputer extends Computer { @Override public Slave getNode() { - return (Slave)super.getNode(); + Node node = super.getNode(); + if (node == null || node instanceof Slave) { + return (Slave)node; + } else { + logger.log(Level.WARNING, "found an unexpected kind of node {0} from {1} with nodeName={2}", new Object[] {node, this, nodeName}); + return null; + } } @Override -- GitLab