diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 262327f05b..2420f05057 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -419,6 +419,25 @@ public class ExtensionList extends AbstractList implements OnMaster { return j == null ? create((Jenkins) null, type) : j.getExtensionList(type); } + /** + * Convenience method allowing lookup of the only instance of a given type. + * Equivalent to {@code ExtensionList.lookup(Class).get(Class)} if there is one instance, + * and throws an {@code IllegalStateException} otherwise. + * + * @param type The type to look up. + * @return the singleton instance of the given type in its list. + * @throws IllegalStateException if there are no instances, or more than one + * + * @since TODO + */ + public static @Nonnull U lookupSingleton(Class type) { + ExtensionList all = lookup(type); + if (all.size() != 1) { + throw new IllegalStateException("Expected 1 instance of " + type.getName() + " but got " + all.size()); + } + return all.get(0); + } + /** * Places to store static-scope legacy instances. */ diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 933b747457..c816805ba6 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -1995,8 +1995,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * Convenience method to ease access to this monitor, this allows other plugins to register required updates. * @return this monitor. */ - public static final PluginUpdateMonitor getInstance() { - return ExtensionList.lookup(PluginUpdateMonitor.class).get(0); + public static PluginUpdateMonitor getInstance() { + return ExtensionList.lookupSingleton(PluginUpdateMonitor.class); } /** diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 3aded0c135..5771bf1e54 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -1122,15 +1122,9 @@ public class UpdateSite { @CheckForNull @Restricted(NoExternalUse.class) public Set getWarnings() { - ExtensionList list = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); - if (list.size() == 0) { - return Collections.emptySet(); - } - + UpdateSiteWarningsConfiguration configuration = ExtensionList.lookupSingleton(UpdateSiteWarningsConfiguration.class); Set warnings = new HashSet<>(); - UpdateSiteWarningsConfiguration configuration = list.get(0); - for (Warning warning: configuration.getAllWarnings()) { if (configuration.isIgnored(warning)) { // warning is currently being ignored diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 10094bcb02..86ba7b9d17 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -1026,11 +1026,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr */ @GuardedBy("User.byNameLock") static ConcurrentMap byName() { - ExtensionList instances = ExtensionList.lookup(AllUsers.class); - if (instances.size() != 1) { - throw new IllegalStateException(); - } - return instances.get(0).byName; + return ExtensionList.lookupSingleton(AllUsers.class).byName; } } diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index a9a5b1af2d..e3e890151e 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3717,9 +3717,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve try { JSONObject json = req.getSubmittedForm(); - MasterBuildConfiguration mbc = MasterBuildConfiguration.all().get(MasterBuildConfiguration.class); - if (mbc!=null) - mbc.configure(req,json); + ExtensionList.lookupSingleton(MasterBuildConfiguration.class).configure(req,json); getNodeProperties().rebuild(req, json.optJSONObject("nodeProperties"), NodeProperty.all()); } finally { @@ -4528,7 +4526,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @RestrictedSince("2.37") @Deprecated public FormValidation doCheckURIEncoding(StaplerRequest request) throws IOException { - return ExtensionList.lookup(URICheckEncodingMonitor.class).get(0).doCheckURIEncoding(request); + return ExtensionList.lookupSingleton(URICheckEncodingMonitor.class).doCheckURIEncoding(request); } /** @@ -4538,7 +4536,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @RestrictedSince("2.37") @Deprecated public static boolean isCheckURIEncodingEnabled() { - return ExtensionList.lookup(URICheckEncodingMonitor.class).get(0).isCheckEnabled(); + return ExtensionList.lookupSingleton(URICheckEncodingMonitor.class).isCheckEnabled(); } /** diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java index 83c2828f1b..ef376b0e5b 100644 --- a/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java @@ -121,12 +121,7 @@ public class UpdateSiteWarningsMonitor extends AdministrativeMonitor { } private Set getActiveWarnings() { - ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); - if (configurations.isEmpty()) { - return Collections.emptySet(); - } - UpdateSiteWarningsConfiguration configuration = configurations.get(0); - + UpdateSiteWarningsConfiguration configuration = ExtensionList.lookupSingleton(UpdateSiteWarningsConfiguration.class); HashSet activeWarnings = new HashSet<>(); for (UpdateSite.Warning warning : configuration.getApplicableWarnings()) { @@ -160,13 +155,7 @@ public class UpdateSiteWarningsMonitor extends AdministrativeMonitor { * @return true iff there are applicable but ignored (i.e. hidden) warnings. */ public boolean hasApplicableHiddenWarnings() { - ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); - if (configurations.isEmpty()) { - return false; - } - - UpdateSiteWarningsConfiguration configuration = configurations.get(0); - + UpdateSiteWarningsConfiguration configuration = ExtensionList.lookupSingleton(UpdateSiteWarningsConfiguration.class); return getActiveWarnings().size() < configuration.getApplicableWarnings().size(); } diff --git a/core/src/main/java/jenkins/security/UserDetailsCache.java b/core/src/main/java/jenkins/security/UserDetailsCache.java index 1d5f221e43..3e5394c205 100644 --- a/core/src/main/java/jenkins/security/UserDetailsCache.java +++ b/core/src/main/java/jenkins/security/UserDetailsCache.java @@ -83,7 +83,7 @@ public final class UserDetailsCache { * @return the cache */ public static UserDetailsCache get() { - return ExtensionList.lookup(UserDetailsCache.class).get(UserDetailsCache.class); + return ExtensionList.lookupSingleton(UserDetailsCache.class); } /**