From c8a6dac2f9087719c107e30b172039198ab97b95 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 2 Jun 2013 19:20:33 -0700 Subject: [PATCH] defer the resolution Otherwise it might try to access a Descriptor that's not yet registered. --- .../main/java/hudson/model/Descriptor.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 414e4124f5..5b9d244b1a 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -223,7 +223,22 @@ public abstract class Descriptor> implements Saveable { * * @see #getHelpFile(String) */ - private transient final Map helpRedirect = new HashMap(); + private transient final Map helpRedirect = new HashMap(); + + private static class HelpRedirect { + private final Class owner; + private final String fieldNameToRedirectTo; + + private HelpRedirect(Class owner, String fieldNameToRedirectTo) { + this.owner = owner; + this.fieldNameToRedirectTo = fieldNameToRedirectTo; + } + + private String resolve() { + // the resolution has to be deferred to avoid ordering issue among descriptor registrations. + return Jenkins.getInstance().getDescriptor(owner).getHelpFile(fieldNameToRedirectTo); + } + } /** * @@ -657,8 +672,8 @@ public abstract class Descriptor> implements Saveable { } public String getHelpFile(Klass clazz, String fieldName) { - String v = helpRedirect.get(fieldName); - if (v!=null) return v; + HelpRedirect r = helpRedirect.get(fieldName); + if (r!=null) return r.resolve(); for (Klass c : clazz.getAncestors()) { String page = "/descriptor/" + getId() + "/help"; @@ -688,8 +703,7 @@ public abstract class Descriptor> implements Saveable { * @since 1.425 */ protected void addHelpFileRedirect(String fieldName, Class owner, String fieldNameToRedirectTo) { - helpRedirect.put(fieldName, - Jenkins.getInstance().getDescriptor(owner).getHelpFile(fieldNameToRedirectTo)); + helpRedirect.put(fieldName, new HelpRedirect(owner,fieldNameToRedirectTo)); } /** -- GitLab