From 6586d779b1652ac91c20e2bb11f8915d1e36beea Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 20 Nov 2013 09:51:19 -0500 Subject: [PATCH] =?UTF-8?q?Better=20null=20safety.=20Defense=20against=20a?= =?UTF-8?q?n=20exception=20consistently=20thrown=20when=20running=20functi?= =?UTF-8?q?onal=20tests=20against=201.532.1=20(but=20not=201.540,=20for=20?= =?UTF-8?q?whatever=20reason):=20=E2=80=A6=20hudson.PluginWrapper=20stop?= =?UTF-8?q?=20WARNING:=20Failed=20to=20shut=20down=20=E2=80=A6=20java.lang?= =?UTF-8?q?.NullPointerException=20=09at=20jenkins.model.Jenkins.lookup(Je?= =?UTF-8?q?nkins.java:3898)=20=09at=20hudson.PluginWrapper.getPlugin(Plugi?= =?UTF-8?q?nWrapper.java:287)=20=09at=20hudson.PluginWrapper.stop(PluginWr?= =?UTF-8?q?apper.java:377)=20=09at=20hudson.PluginManager.stop(PluginManag?= =?UTF-8?q?er.java:650)=20=09at=20org.jvnet.hudson.test.TestPluginManager.?= =?UTF-8?q?reallyStop(TestPluginManager.java:129)=20=09at=20org.jvnet.huds?= =?UTF-8?q?on.test.TestPluginManager.access$000(TestPluginManager.java:55)?= =?UTF-8?q?=20=09at=20org.jvnet.hudson.test.TestPluginManager$1.run(TestPl?= =?UTF-8?q?uginManager.java:140)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/hudson/PluginWrapper.java | 21 ++++++++++++------- core/src/main/java/jenkins/model/Jenkins.java | 7 ++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 8d590e4079..3245888194 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -55,6 +55,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST; import java.util.Enumeration; import java.util.jar.JarFile; import java.util.logging.Level; +import javax.annotation.CheckForNull; /** * Represents a Jenkins plug-in and associated control information @@ -284,8 +285,9 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Gets the instance of {@link Plugin} contributed by this plugin. */ - public Plugin getPlugin() { - return Jenkins.lookup(PluginInstanceStore.class).store.get(this); + public @CheckForNull Plugin getPlugin() { + PluginInstanceStore pis = Jenkins.lookup(PluginInstanceStore.class); + return pis != null ? pis.store.get(this) : null; } /** @@ -373,11 +375,16 @@ public class PluginWrapper implements Comparable, ModelObject { * Terminates the plugin. */ public void stop() { - LOGGER.log(Level.FINE, "Stopping {0}", shortName); - try { - getPlugin().stop(); - } catch(Throwable t) { - LOGGER.log(WARNING, "Failed to shut down "+shortName, t); + Plugin plugin = getPlugin(); + if (plugin != null) { + try { + LOGGER.log(Level.FINE, "Stopping {0}", shortName); + plugin.stop(); + } catch (Throwable t) { + LOGGER.log(WARNING, "Failed to shut down " + shortName, t); + } + } else { + LOGGER.log(Level.FINE, "Could not find Plugin instance to stop for {0}", shortName); } // Work around a bug in commons-logging. // See http://www.szegedi.org/articles/memleak.html diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index ecc8317398..03ead6b7c3 100755 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3880,10 +3880,11 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro } /** - * Shortcut for {@code Hudson.getInstance().lookup.get(type)} + * Shortcut for {@code Jenkins.getInstance().lookup.get(type)} */ - public static T lookup(Class type) { - return Jenkins.getInstance().lookup.get(type); + public static @CheckForNull T lookup(Class type) { + Jenkins j = Jenkins.getInstance(); + return j != null ? j.lookup.get(type) : null; } /** -- GitLab