diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 1ca477dce1daa4ca04c4789d7877293181414444..a503627018873e97bad66902f4468060d2817f00 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -1306,10 +1306,16 @@ public class PluginWrapper implements Comparable, ModelObject { public List getDeprecations() { /* Would be much nicer to go through getInfoFromAllSites but that only works for currently published plugins */ List deprecations = new ArrayList<>(); - for (UpdateSite site : Jenkins.get().getUpdateCenter().getSites()) { - for (Map.Entry entry : site.getData().getDeprecations().entrySet()) { - if (entry.getKey().equals(this.shortName)) { - deprecations.add(entry.getValue()); + final UpdateCenter updateCenter = Jenkins.get().getUpdateCenter(); + if (updateCenter.isSiteDataReady()) { + for (UpdateSite site : updateCenter.getSites()) { + final UpdateSite.Data data = site.getData(); + if (data != null) { + for (Map.Entry entry : data.getDeprecations().entrySet()) { + if (entry.getKey().equals(this.shortName)) { + deprecations.add(entry.getValue()); + } + } } } } diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 41bda4634cc08f077d66a5e5df0a805c52f4beb9..4bfa24729f9fa3f1f9d7f9b3d86965a179c496e0 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -336,6 +336,7 @@ public class UpdateSite { * * @return null if no data is available. */ + @CheckForNull public Data getData() { if (data == null) { JSONObject o = getJSONObject(); diff --git a/core/src/main/java/jenkins/management/PluginsLink.java b/core/src/main/java/jenkins/management/PluginsLink.java index 8910c62890f18c304615a92870c165f7ee607f99..82866a7d7f19e48f66e21728ee33457e1ac2d49a 100644 --- a/core/src/main/java/jenkins/management/PluginsLink.java +++ b/core/src/main/java/jenkins/management/PluginsLink.java @@ -26,11 +26,14 @@ package jenkins.management; import hudson.Extension; import hudson.model.ManagementLink; +import hudson.model.UpdateCenter; import hudson.security.Permission; import jenkins.model.Jenkins; import org.jenkinsci.Symbol; import edu.umd.cs.findbugs.annotations.NonNull; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * @author Nicolas De Loof @@ -68,4 +71,14 @@ public class PluginsLink extends ManagementLink { public Category getCategory() { return Category.CONFIGURATION; } + + @Restricted(NoExternalUse.class) + public boolean hasUpdates() { + final UpdateCenter updateCenter = Jenkins.get().getUpdateCenter(); + if (!updateCenter.isSiteDataReady()) { + // Do not display message during this page load, but possibly later. + return false; + } + return !updateCenter.getUpdates().isEmpty(); + } } diff --git a/core/src/main/resources/jenkins/management/PluginsLink/info.jelly b/core/src/main/resources/jenkins/management/PluginsLink/info.jelly index c5ab316892f3b513a110e299dad46cd71f70e205..98faafac4387576ab513aa1f5eab2ac32679b4eb 100644 --- a/core/src/main/resources/jenkins/management/PluginsLink/info.jelly +++ b/core/src/main/resources/jenkins/management/PluginsLink/info.jelly @@ -24,7 +24,7 @@ - + ${%updates available} \ No newline at end of file