提交 6586d779 编写于 作者: J Jesse Glick

Better null safety.

Defense against an exception consistently thrown when running functional tests against 1.532.1 (but not 1.540, for whatever reason):
… hudson.PluginWrapper stop
WARNING: Failed to shut down …
java.lang.NullPointerException
	at jenkins.model.Jenkins.lookup(Jenkins.java:3898)
	at hudson.PluginWrapper.getPlugin(PluginWrapper.java:287)
	at hudson.PluginWrapper.stop(PluginWrapper.java:377)
	at hudson.PluginManager.stop(PluginManager.java:650)
	at org.jvnet.hudson.test.TestPluginManager.reallyStop(TestPluginManager.java:129)
	at org.jvnet.hudson.test.TestPluginManager.access$000(TestPluginManager.java:55)
	at org.jvnet.hudson.test.TestPluginManager$1.run(TestPluginManager.java:140)
上级 90395ee6
...@@ -55,6 +55,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST; ...@@ -55,6 +55,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.logging.Level; import java.util.logging.Level;
import javax.annotation.CheckForNull;
/** /**
* Represents a Jenkins plug-in and associated control information * Represents a Jenkins plug-in and associated control information
...@@ -284,8 +285,9 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject { ...@@ -284,8 +285,9 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject {
/** /**
* Gets the instance of {@link Plugin} contributed by this plugin. * Gets the instance of {@link Plugin} contributed by this plugin.
*/ */
public Plugin getPlugin() { public @CheckForNull Plugin getPlugin() {
return Jenkins.lookup(PluginInstanceStore.class).store.get(this); PluginInstanceStore pis = Jenkins.lookup(PluginInstanceStore.class);
return pis != null ? pis.store.get(this) : null;
} }
/** /**
...@@ -373,11 +375,16 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject { ...@@ -373,11 +375,16 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject {
* Terminates the plugin. * Terminates the plugin.
*/ */
public void stop() { public void stop() {
LOGGER.log(Level.FINE, "Stopping {0}", shortName); Plugin plugin = getPlugin();
try { if (plugin != null) {
getPlugin().stop(); try {
} catch(Throwable t) { LOGGER.log(Level.FINE, "Stopping {0}", shortName);
LOGGER.log(WARNING, "Failed to shut down "+shortName, t); 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. // Work around a bug in commons-logging.
// See http://www.szegedi.org/articles/memleak.html // See http://www.szegedi.org/articles/memleak.html
......
...@@ -3880,10 +3880,11 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro ...@@ -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> T lookup(Class<T> type) { public static @CheckForNull <T> T lookup(Class<T> type) {
return Jenkins.getInstance().lookup.get(type); Jenkins j = Jenkins.getInstance();
return j != null ? j.lookup.get(type) : null;
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册