Class Descriptor<T extends Describable<T>>
- java.lang.Object
-
- hudson.model.Descriptor<T>
-
- Direct Known Subclasses:
AbstractNodeMonitorDescriptor,ArtifactManagerFactoryDescriptor,AuthorizationStrategy.Unsecured.DescriptorImpl,BuildDiscarderDescriptor,BuildStepDescriptor,BuildWrapperDescriptor,CaptchaSupportDescriptor,CloudSet.DescriptorImpl,ComputerConnectorDescriptor,ComputerSet.DescriptorImpl,ConsoleAnnotationDescriptor,Correlator,CrumbIssuerDescriptor,DefaultConsoleUrlProvider.DescriptorImpl,DelegatingComputerLauncher.DescriptorImpl,EnvVarsFilterLocalRuleDescriptor,FingerprintStorageDescriptor,FullControlOnceLoggedInAuthorizationStrategy.DescriptorImpl,GlobalBuildDiscarderStrategyDescriptor,GlobalConfiguration,GlobalSecurityConfiguration.DescriptorImpl,GlobalSettingsProviderDescriptor,HudsonPrivateSecurityRealm.DescriptorImpl,IdStrategyDescriptor,JNLPLauncher.DescriptorImpl,JobPropertyDescriptor,LabelAtomPropertyDescriptor,LegacyAuthorizationStrategy.DescriptorImpl,LegacySecurityRealm.DescriptorImpl,ListViewColumnDescriptor,MarkupFormatterDescriptor,MyViewsTabBarDescriptor,NodeDescriptor,PageDecorator,ParameterDefinition.ParameterDescriptor,ProjectNamingStrategy.ProjectNamingStrategyDescriptor,PropertyDescriptor,ProxyConfiguration.DescriptorImpl,QueueItemAuthenticatorDescriptor,RemotingWorkDirSettings.DescriptorImpl,RetentionStrategy.Always.DescriptorImpl,RetentionStrategy.Demand.DescriptorImpl,SCMCheckoutStrategyDescriptor,SCMDescriptor,SettingsProviderDescriptor,SimplePageDecorator,SimpleScheduledRetentionStrategy.DescriptorImpl,StatusFilter.StatusFilterDescriptor,ToolDescriptor,ToolInstallerDescriptor,TopLevelItemDescriptor,TriggerDescriptor,UserPropertyDescriptor,ViewDescriptor,ViewPropertyDescriptor,ViewsTabBarDescriptor
public abstract class Descriptor<T extends Describable<T>> extends Object implements Loadable, Saveable, OnMaster
Metadata about a configurable instance.Descriptoris an object that has metadata about aDescribableobject, and also serves as a factory (in a way this relationship is similar toObject/Classrelationship. ADescriptor/Describablecombination is used throughout in Jenkins to implement a configuration/extensibility mechanism.Take the list view support as an example, which is implemented in
ListViewclass. Whenever a new view is created, a newListViewinstance is created with the configuration information. This instance gets serialized to XML, and this instance will be called to render the view page. This is the job ofDescribable— each instance represents a specific configuration of a view (what projects are in it, regular expression, etc.)For Jenkins to create such configured
ListViewinstance, Jenkins needs another object that captures the metadata ofListView, and that is what aDescriptoris for.ListViewclass has a singleton descriptor, and this descriptor helps render the configuration form, remember system-wide configuration, and works as a factory.Descriptoralso usually have its associated views.Persistence
Descriptorcan persist data just by storing them in fields. However, it is the responsibility of the derived type to properly invokesave()andload().load()is automatically invoked as a JSR-250 lifecycle method if derived class do implementPersistentDescriptor.Reflection Enhancement
Descriptordefines addition to the standard Java reflection and provides reflective information about its correspondingDescribable. These are primarily used by tag libraries to keep the Jelly scripts concise.- Author:
- Kohsuke Kawaguchi
- See Also:
Describable
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classDescriptor.FormExceptionstatic classDescriptor.PropertyTypeRepresents a readable property onDescribable.static classDescriptor.SelfSpecial type indicating thatDescriptordescribes itself.
-
Constructor Summary
Constructors Modifier Constructor Description protectedDescriptor()Infers the type of the correspondingDescribablefrom the outer class.protectedDescriptor(Class<? extends T> clazz)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected voidaddHelpFileRedirect(String fieldName, Class<? extends Describable> owner, String fieldNameToRedirectTo)Tells Jenkins that the help file for the field 'fieldName' is defined in the help file for the 'fieldNameToRedirectTo' in the 'owner' class.static <T> TbindJSON(org.kohsuke.stapler.StaplerRequest req, Class<T> type, net.sf.json.JSONObject src)Replacement forStaplerRequest.bindJSON(Class, JSONObject)which honorsnewInstance(StaplerRequest, JSONObject).voidcalcAutoCompleteSettings(String field, Map<String,Object> attributes)Computes the auto-completion settingvoidcalcFillSettings(String field, Map<String,Object> attributes)Computes the list of other form fields that the given field depends on, via the doFillXyzItems method, and sets that as the 'fillDependsOn' attribute.booleanconfigure(org.kohsuke.stapler.StaplerRequest req)Deprecated.As of 1.239, useconfigure(StaplerRequest, JSONObject).booleanconfigure(org.kohsuke.stapler.StaplerRequest req, net.sf.json.JSONObject json)Invoked when the global configuration page is submitted.voiddoHelp(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp)Serveshelp.htmlfrom the resource ofclazz.static Descriptorfind(String className)static <T extends Descriptor>
Tfind(Collection<? extends T> list, String string)static <T extends Descriptor>
TfindByDescribableClassName(Collection<? extends T> list, String className)Finds a descriptor from a collection by the class name of theDescribableit describes.static <T extends Descriptor>
TfindById(Collection<? extends T> list, String id)Finds a descriptor from a collection by its ID.GlobalConfigurationCategorygetCategory()Define the global configuration category the global config of this Descriptor is in.FormValidation.CheckMethodgetCheckMethod(String fieldName)If the field "xyz" of aDescribablehas the corresponding "doCheckXyz" method, return the model of the check method.StringgetCheckUrl(String fieldName)Deprecated.since 1.528 UsegetCheckMethod(String)protected XmlFilegetConfigFile()StringgetConfigPage()static StringgetCurrentDescriptorByNameUrl()StringgetDescriptorFullUrl()Gets the URL that this Descriptor is bound to, relative to the context path.StringgetDescriptorUrl()Gets the URL that this Descriptor is bound to, relative to the nearestDescriptorByNameOwner.StringgetDisplayName()Human readable name of this kind of configurable object.StringgetGlobalConfigPage()Descriptor.PropertyTypegetGlobalPropertyType(String field)Obtains the property type of the given field of this descriptor.StringgetHelpFile()Returns the resource path to the help screen HTML, if any.StringgetHelpFile(String fieldName)Returns the path to the help screen HTML for the given field.StringgetHelpFile(org.kohsuke.stapler.lang.Klass<?> clazz, String fieldName)StringgetId()Uniquely identifies thisDescriptoramong all the otherDescriptors.StringgetJsonSafeClassName()Gets the class name nicely escaped to be usable as a key in the structured form submission.org.kohsuke.stapler.lang.Klass<?>getKlass()Returns theKlassobject used for the purpose of loading resources from this descriptor.protected PluginWrappergetPlugin()Returns the plugin in which this descriptor is defined.protected List<String>getPossibleViewNames(String baseName)Descriptor.PropertyTypegetPropertyType(Object instance, String field)Used by Jelly to abstract away the handling of global.jelly vs config.jelly databinding difference.Descriptor.PropertyTypegetPropertyType(String field)Obtains the property type of the given field ofclazzDescriptor.PropertyTypegetPropertyTypeOrDie(Object instance, String field)Akin togetPropertyType(Object,String)but never returns null.PermissiongetRequiredGlobalConfigPagePermission()Returns the permission type needed in order to access thegetGlobalConfigPage()for this descriptor.static URLgetStaticHelpUrl(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.lang.Klass<?> c, String suffix)Class<T>getT()Unlikeclazz, return the parameter type 'T', which determines theDescriptorExtensionListthat this goes to.protected StringgetViewPage(Class<?> clazz, String pageName)booleanisInstance(T instance)Checks if the given object is created from thisDescriptor.booleanisSubTypeOf(Class type)Checks if the type represented by this descriptor is a subtype of the given type.voidload()Loads the data from the disk into this object.TnewInstance(org.kohsuke.stapler.StaplerRequest req)Deprecated.ImplementnewInstance(StaplerRequest, JSONObject)method instead.TnewInstance(org.kohsuke.stapler.StaplerRequest req, net.sf.json.JSONObject formData)Creates a configured instance from the submitted form.static <T extends Describable<T>>
List<T>newInstancesFromHeteroList(org.kohsuke.stapler.StaplerRequest req, Object formData, Collection<? extends Descriptor<T>> descriptors)static <T extends Describable<T>>
List<T>newInstancesFromHeteroList(org.kohsuke.stapler.StaplerRequest req, net.sf.json.JSONObject formData, String key, Collection<? extends Descriptor<T>> descriptors)Used to buildDescribableinstance list from<f:hetero-list>tag.voidsave()Saves the configuration info to the disk.protected static Classself()static <T> T[]toArray(T... values)static <T> List<T>toList(T... values)static <T extends Describable<T>>
Map<Descriptor<T>,T>toMap(Iterable<T> describables)
-
-
-
Field Detail
-
clazz
public final transient Class<? extends T extends Describable<T>> clazz
The class being described by this descriptor.
-
-
Constructor Detail
-
Descriptor
protected Descriptor(Class<? extends T> clazz)
- Parameters:
clazz- Pass inself()to have the descriptor describe itself, (this hack is needed since derived types can't call "getClass()" to refer to itself.
-
Descriptor
protected Descriptor()
Infers the type of the correspondingDescribablefrom the outer class. This version works when you follow the common convention, where a descriptor is written as the static nested class of the describable class.- Since:
- 1.278
-
-
Method Detail
-
getDisplayName
@NonNull public String getDisplayName()
Human readable name of this kind of configurable object. Should be overridden for most descriptors, if the display name is visible somehow. As a fallback it usesClass.getSimpleName()onclazz, so for exampleMyThingfromsome.pkg.MyThing.DescriptorImpl. Historically some implementations returned null as a way of hiding the descriptor from the UI, but this is generally managed by an explicit method such asisEnabledorisApplicable.
-
getId
public String getId()
Uniquely identifies thisDescriptoramong all the otherDescriptors.Historically
clazzis assumed to be unique, so this method uses that as the default, but if you are addingDescriptors programmatically for the same type, you can change this to disambiguate them.To look up
Descriptorfrom ID, useJenkins.getDescriptor(String).- Returns:
- Stick to valid Java identifier character, plus '.', which had to be allowed for historical reasons.
- Since:
- 1.391
-
getT
public Class<T> getT()
Unlikeclazz, return the parameter type 'T', which determines theDescriptorExtensionListthat this goes to.In those situations where subtypes cannot provide the type parameter, this method can be overridden to provide it.
-
getDescriptorUrl
public String getDescriptorUrl()
Gets the URL that this Descriptor is bound to, relative to the nearestDescriptorByNameOwner. SinceJenkinsis aDescriptorByNameOwner, there's always one such ancestor to any request.
-
getDescriptorFullUrl
public final String getDescriptorFullUrl()
Gets the URL that this Descriptor is bound to, relative to the context path.- Since:
- 1.406
-
getCurrentDescriptorByNameUrl
public static String getCurrentDescriptorByNameUrl()
- Since:
- 1.402
-
getCheckUrl
@Deprecated public String getCheckUrl(String fieldName)
Deprecated.since 1.528 UsegetCheckMethod(String)
-
getCheckMethod
public FormValidation.CheckMethod getCheckMethod(String fieldName)
If the field "xyz" of aDescribablehas the corresponding "doCheckXyz" method, return the model of the check method.This method is used to hook up the form validation method to the corresponding HTML input element.
-
calcFillSettings
public void calcFillSettings(String field, Map<String,Object> attributes)
Computes the list of other form fields that the given field depends on, via the doFillXyzItems method, and sets that as the 'fillDependsOn' attribute. Also computes the URL of the doFillXyzItems and sets that as the 'fillUrl' attribute.
-
calcAutoCompleteSettings
public void calcAutoCompleteSettings(String field, Map<String,Object> attributes)
Computes the auto-completion setting
-
getPropertyType
@CheckForNull public Descriptor.PropertyType getPropertyType(@NonNull Object instance, @NonNull String field)
Used by Jelly to abstract away the handling of global.jelly vs config.jelly databinding difference.
-
getPropertyTypeOrDie
@NonNull public Descriptor.PropertyType getPropertyTypeOrDie(@NonNull Object instance, @NonNull String field)
Akin togetPropertyType(Object,String)but never returns null.- Throws:
AssertionError- in case the field cannot be found- Since:
- 1.492
-
getPropertyType
public Descriptor.PropertyType getPropertyType(String field)
Obtains the property type of the given field ofclazz
-
getGlobalPropertyType
public Descriptor.PropertyType getGlobalPropertyType(String field)
Obtains the property type of the given field of this descriptor.
-
getJsonSafeClassName
public final String getJsonSafeClassName()
Gets the class name nicely escaped to be usable as a key in the structured form submission.
-
newInstance
@Deprecated public T newInstance(org.kohsuke.stapler.StaplerRequest req) throws Descriptor.FormException
Deprecated.ImplementnewInstance(StaplerRequest, JSONObject)method instead. Deprecated as of 1.145.- Throws:
Descriptor.FormException
-
newInstance
public T newInstance(@Nullable org.kohsuke.stapler.StaplerRequest req, @NonNull net.sf.json.JSONObject formData) throws Descriptor.FormException
Creates a configured instance from the submitted form.Hudson only invokes this method when the user wants an instance of
T. So there's no need to check that in the implementation.The default implementation of this method uses
bindJSON(org.kohsuke.stapler.StaplerRequest, java.lang.Class<T>, net.sf.json.JSONObject)which performs the databinding on the constructor ofclazz.For some types of
Describable, such asListViewColumn, this method can be invoked with null request object for historical reason. Such design is considered broken, but due to the compatibility reasons we cannot fix it. Because of this, the default implementation gracefully handles null request, but the contract of the method still is "request is always non-null." Extension points that need to define the "default instance" semantics should define a descriptor subtype and add the no-arg newInstance method.- Parameters:
req- Always non-null (see note above.) This object includes represents the entire submission.formData- The JSON object that captures the configuration data for thisDescriptor. See the developer documentation. Always non-null.- Throws:
Descriptor.FormException- Signals a problem in the submitted form.- Since:
- 1.145
-
bindJSON
public static <T> T bindJSON(org.kohsuke.stapler.StaplerRequest req, Class<T> type, net.sf.json.JSONObject src)Replacement forStaplerRequest.bindJSON(Class, JSONObject)which honorsnewInstance(StaplerRequest, JSONObject). This is automatically used insidenewInstance(StaplerRequest, JSONObject)so a direct call would only be necessary in case the top level binding might use aDescriptorwhich overridesnewInstance(StaplerRequest, JSONObject).- Since:
- 2.342
-
getKlass
public org.kohsuke.stapler.lang.Klass<?> getKlass()
Returns theKlassobject used for the purpose of loading resources from this descriptor. This hook enables other JVM languages to provide more integrated lookup.
-
getHelpFile
public String getHelpFile()
Returns the resource path to the help screen HTML, if any.Starting 1.282, this method uses "convention over configuration" — you should just put the "help.html" (and its localized versions, if any) in the same directory you put your Jelly view files, and this method will automatically does the right thing.
This value is relative to the context root of Hudson, so normally the values are something like
"/plugin/emma/help.html"to refer to static resource files in a plugin, or"/publisher/EmmaPublisher/abc"to refer to Jelly scriptabc.jellyor a methodEmmaPublisher.doAbc().- Returns:
- null to indicate that there's no help.
-
getHelpFile
public String getHelpFile(String fieldName)
Returns the path to the help screen HTML for the given field.The help files are assumed to be at "help/FIELDNAME.html" with possible locale variations.
-
addHelpFileRedirect
protected void addHelpFileRedirect(String fieldName, Class<? extends Describable> owner, String fieldNameToRedirectTo)
Tells Jenkins that the help file for the field 'fieldName' is defined in the help file for the 'fieldNameToRedirectTo' in the 'owner' class.- Since:
- 1.425
-
isInstance
public final boolean isInstance(T instance)
Checks if the given object is created from thisDescriptor.
-
isSubTypeOf
public final boolean isSubTypeOf(Class type)
Checks if the type represented by this descriptor is a subtype of the given type.
-
configure
@Deprecated public boolean configure(org.kohsuke.stapler.StaplerRequest req) throws Descriptor.FormException
Deprecated.As of 1.239, useconfigure(StaplerRequest, JSONObject).- Throws:
Descriptor.FormException
-
configure
public boolean configure(org.kohsuke.stapler.StaplerRequest req, net.sf.json.JSONObject json) throws Descriptor.FormExceptionInvoked when the global configuration page is submitted. Can be overridden to store descriptor-specific information.- Parameters:
json- The JSON object that captures the configuration data for thisDescriptor. See the developer documentation.- Returns:
- false to keep the client in the same config page.
- Throws:
Descriptor.FormException
-
getConfigPage
public String getConfigPage()
-
getGlobalConfigPage
public String getGlobalConfigPage()
-
getCategory
@NonNull public GlobalConfigurationCategory getCategory()
Define the global configuration category the global config of this Descriptor is in.- Returns:
- never null, always the same value for a given instance of
Descriptor. - Since:
- 2.0, used to be in
GlobalConfigurationbefore that.
-
getRequiredGlobalConfigPagePermission
@NonNull public Permission getRequiredGlobalConfigPagePermission()
Returns the permission type needed in order to access thegetGlobalConfigPage()for this descriptor. By default, requiresJenkins.ADMINISTERpermission. For now this only applies to descriptors configured through the global (GlobalConfigurationCategory.Unclassified) configuration. Override to return something different if appropriate. The only currently supported alternative return value isJenkins.MANAGE.- Returns:
- Permission required to globally configure this descriptor.
- Since:
- 2.222
-
save
public void save()
Saves the configuration info to the disk.
-
load
public void load()
Loads the data from the disk into this object.The constructor of the derived class must call this method. (If we do that in the base class, the derived class won't get a chance to set default values.)
-
getConfigFile
protected XmlFile getConfigFile()
-
getPlugin
protected PluginWrapper getPlugin()
Returns the plugin in which this descriptor is defined.- Returns:
- null to indicate that this descriptor came from the core.
-
doHelp
public void doHelp(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp) throws IOException, javax.servlet.ServletExceptionServeshelp.htmlfrom the resource ofclazz.- Throws:
IOExceptionjavax.servlet.ServletException
-
getStaticHelpUrl
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) public static URL getStaticHelpUrl(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.lang.Klass<?> c, String suffix)
-
toArray
public static <T> T[] toArray(T... values)
-
toList
public static <T> List<T> toList(T... values)
-
toMap
public static <T extends Describable<T>> Map<Descriptor<T>,T> toMap(Iterable<T> describables)
-
newInstancesFromHeteroList
public static <T extends Describable<T>> List<T> newInstancesFromHeteroList(org.kohsuke.stapler.StaplerRequest req, net.sf.json.JSONObject formData, String key, Collection<? extends Descriptor<T>> descriptors) throws Descriptor.FormException
Used to buildDescribableinstance list from<f:hetero-list>tag.- Parameters:
req- Request that represents the form submission.formData- Structured form data that represents the contains data for the list of describables.key- The JSON property name for 'formData' that represents the data for the list of describables.descriptors- List of descriptors to create instances from.- Returns:
- Can be empty but never null.
- Throws:
Descriptor.FormException
-
newInstancesFromHeteroList
public static <T extends Describable<T>> List<T> newInstancesFromHeteroList(org.kohsuke.stapler.StaplerRequest req, Object formData, Collection<? extends Descriptor<T>> descriptors) throws Descriptor.FormException
- Throws:
Descriptor.FormException
-
findById
@CheckForNull public static <T extends Descriptor> T findById(Collection<? extends T> list, String id)
Finds a descriptor from a collection by its ID.- Parameters:
id- should matchgetId()- Since:
- 1.610
-
findByDescribableClassName
@CheckForNull public static <T extends Descriptor> T findByDescribableClassName(Collection<? extends T> list, String className)
Finds a descriptor from a collection by the class name of theDescribableit describes.- Parameters:
className- should matchClass.getName()of aclazz- Since:
- 1.610
-
find
@Deprecated @CheckForNull public static <T extends Descriptor> T find(Collection<? extends T> list, String string)
Deprecated.Finds a descriptor from a collection by its class name or ID.
-
find
@Deprecated @CheckForNull public static Descriptor find(String className)
-
self
protected static Class self()
-
-