# Type Descriptor

Describes a type in the Deployit type system. A descriptor is rendered in XML as a `<descriptor>` element containing attributes and child elements. Here's a breakdown of the structure.

## The `<descriptor>` element

### Attributes

type
  The name of the type. A type name consists of a package name followed by a dot and then the actual name. For example: `core.Directory`
deployableType
  The name of the deployable type. Only applicable for deployeds, the deployable type refers the environment-indendent CI that created this deployed.
containerType
  The name of the container type. Only applicable for deployeds, the container type refers to type of container this deployed can be deployed to.
virtual
  Whether this type is a virtual type. (Boolean)
inspectable
  Whether this type supports inspection. (Boolean)
rooted
  The root node in the repository this type can be created under. If not present, this type can't be created directly under a root node. Possible values: `Applications`, `Environments` or `Infrastructure`

### Child elements

<description>
  Contains a textual description of this type.
<property-descriptors>
  The properties of this type. Contains a list of `<property-descriptor>` elements.
<control-tasks>
  The control tasks exposed by this type. Contains a list of `<control-task>` elements.
<interfaces>
  The interfaces implemented by this type. Contains a list of `<#interface>` elements, each of which contains a single type name.
<superTypes>
  The supertype chain of this type. Contains a list of `<#superType>` elements, each of which contains a single type name.

### Type descriptor example

    <descriptor type="overthere.SshHost" virtual="false" root="Infrastructure">
      <description>A machine that can be connected to using ssh.</description>
      <property-descriptors>
        ...
      </property-descriptors>
      <control-tasks>
        <control-task name="checkConnection" fqn="overthere.SshHost.checkConnection" description="Check connection"/>
      </control-tasks>
      <interfaces>
        <interface>udm.Taggable</interface>
        <interface>udm.ConfigurationItem</interface>
        <interface>udm.Container</interface>
        <interface>overthere.HostContainer</interface>
      </interfaces>
      <superTypes>
        <superType>overthere.Host</superType>
        <superType>udm.BaseContainer</superType>
        <superType>udm.BaseConfigurationItem</superType>
      </superTypes>
    </descriptor>

## The `<property-descriptor>` element

Describes a property of a Deployit type.

### Attributes

name
  The name of the property.
fqn
  The fully qualified name of the property. This is the type name followed by a dot and then the property name. For example: `overthere.SshJumpstation.port`
label
  Label text for use in the UI.
kind
  The property type. Possible values: `BOOLEAN`, `INTEGER`, `STRING`, `ENUM`, `CI`, `SET_OF_STRING`, `SET_OF_CI`, `LIST_OF_STRING`, `LIST_OF_CI` or `MAP_STRING_STRING`
description
  Textual description of the property.
category
  The category of this property. The UI groups all properties in the same category into a tab of their own.
asContainment
  Indicates a parent / child relationship (Boolean). Only applicable for properties that refer to other CIs. If `asContainment` is set to `true` and the property is of kind `CI` then we are referring to the parent of this CI. If the kind is `LIST_OF_CI` or `SET_OF_CI`, then this CI is the parent and this property refers to its children.
required
  Whether this property is required (Boolean).
inspection
  Whether this property is used when doing inspection (Boolean). Only relevant if the CI supports inspection.
requiredInspection
  Whether this property is required when doing inspection (Boolean). Only relevant if the CI supports inspection.
password
  Whether this property is a password (Boolean). Only applicable for String property types. Contents maybe masked with '*' character.
transient
  Whether this property is transient (Boolean). Transient properties will not be stored.
size
  Indicates the size of the input field in the UI. Possible values: `DEFAULT`, `SMALL`, `MEDIUM` or `LARGE`

### Child elements

<referencedType>
  For properties that refer to CIs, this indicates the type of CI to refer to. Contains the name of the referred type as content.
<defaultValue>
  The default value of the property, as String.
<enumValues>
  For properties of type `ENUM`, this element contains all possible values, wrapped in `<string>` elements.

### Property descriptor examples

Property with enum values:

    <property-descriptor name="os" fqn="overthere.SshHost.os" label="Os" kind="ENUM" description="Operating system"
        category="Common" asContainment="false" inspection="false" required="true" requiredInspection="false"
        password="false" transient="false" size="DEFAULT">
      <enumValues>
        <string>WINDOWS</string>
        <string>UNIX</string>
      </enumValues>
    </property-descriptor>

Property referring to a parent CI

    <descriptor type="udm.CompositePackage" virtual="false">
      <property-descriptor name="application" fqn="udm.CompositePackage.application" label="Application" kind="CI"
          asContainment="true" ...>
        <referencedType>udm.Application</referencedType>
      </property-descriptor>
      ...
    </descriptor>

## The `<control-task>` element

### Attributes

name
  The name of the control task.
fqn
  The fully qualified name of the control task. This is the type name followed by a dot and then the control task name. For example: `overthere.SshJumpstation.checkConnection`
description
  Textual description of the control task.

### Example

    <control-task name="checkConnection" fqn="overthere.SshJumpstation.checkConnection" description="Check connection"/>