Skip to content

Attribute Pipeline ​

Purpose ​

The attribute pipeline transforms WildFly management model metadata into view and form items for the UI. It bridges the gap between raw attribute descriptions (metadata only from the management model) and interactive UI controls that display values and enable editing.

The pipeline solves the core problem of rendering heterogeneous WildFly attributes — simple scalars, complex nested objects, sibling groups, and composite structures — through a consistent, extensible architecture.

Design ​

The pipeline uses a two-tier architecture: handlers claim and produce items for known patterns, while providers handle unclaimed attributes and child attributes delegated by handlers.

Handlers ​

AttributeHandlers scan the attribute pool in priority order, claiming groups of related attributes into AttributeMatches. Each handler both claims and produces items for its matches. Handlers bridge the description world (metadata only) and the value world (resolved snapshots with current values and RBAC state).

Registered handlers in priority order:

PriorityHandlerPatternAttributes
1CredentialReferenceHandlerOBJECT with {store, alias, clear-text}49
2TimeUnitHandlerOBJECT with {time, unit}8
3FileHandlerOBJECT with {path, relative-to}9
4PathRelativeToHandlersibling path + relative-to STRING pairs31
5MapHandlerOBJECT with simple scalar VALUE_TYPE178
6ListSimpleRecordHandlerLIST of OBJECT with all simple/LIST-of-simple sub-attributes27
7FlatteningHandlersimpleRecord OBJECTs (all simple sub-attributes)111

Providers ​

ItemProviders handle unclaimed attributes and child attributes delegated by handlers. Providers operate in the value world only — they receive already-resolved ResolvedAttributes. First match wins.

Registered providers in order:

PriorityProviderPatternAttributes
1RelativeToProviderstandalone relative-to attributes (form only)1
2DefaultProvidertype-based dispatch catch-all5,384

Type Flow ​

The pipeline operates through distinct type transformations:

AttributeMatch lives in the description world. ResolvedAttribute lives in the value world. Handlers bridge the two — they receive matches and context, perform resolution, and either produce items directly or delegate children to the provider chain via Pipeline.viewItem/formItem.

Use Cases ​

The pipeline handles four distinct attribute patterns:

PatternMatchResolutionItemsExample
Single attributeUnclaimed1 resolved1 item, 1 resolvedenabled (STRING)
Composite OBJECT1 OBJECT desc1 parent + n children1 composite itemcredential-reference
Flattened simple-record1 OBJECT desc1 parent + n childrenn items with FQN paths{foo, bar} OBJECT
Sibling groupn descsn resolved1 composite itempath + relative-to
List of simple records1 LIST desc1 parent, n entries × m children1 table itemrealms, global-modules

Single Attribute ​

A standalone STRING, BOOLEAN, INT, etc.

Match:    no handler claims it → unclaimed
Resolve:  Pipeline resolves → ResolvedAttribute(enabled)
Provider: DefaultProvider → SwitchControl / StringControl / etc.
Item:     1 item, 1 ResolvedAttribute

Composite OBJECT ​

An OBJECT kept as a single unit (e.g., credential-reference).

Match:    CredentialReferenceHandler claims it → AttributeMatch([credential-reference])
Handler:  resolves parent, derives children (store, alias, clear-text) via parent.child()
          delegates children to provider chain → DefaultProvider creates child items
          wraps in composite CredentialReferenceViewItem / CredentialReferenceControl
Item:     1 composite item

Flattened Simple-Record OBJECT ​

An OBJECT with all simple sub-attributes, flattened into individual items.

Match:    FlatteningHandler claims it → AttributeMatch([my-record])
Handler:  resolves parent (RBAC captured), derives children:
          → parent.child("foo") → ResolvedAttribute(foo) with fqn="my-record.foo"
          → parent.child("bar") → ResolvedAttribute(bar) with fqn="my-record.bar"
          Each child inherits the parent's readable/writable state.
          Delegates each child to Pipeline.viewItem/formItem → provider chain.
Items:    n items, each holds 1 ResolvedAttribute with FQN path

Sibling Group ​

Multiple sibling attributes that semantically belong together (e.g., path + relative-to).

Match:    PathRelativeToHandler claims both → AttributeMatch([path, relative-to])
Handler:  resolves both attributes against context
          creates composite PathRelativeToViewItem / PathRelativeToFormItem
Item:     1 composite item, holds 2 ResolvedAttributes

List of Simple Records ​

A LIST where each entry is an OBJECT with all simple sub-attributes.

Match:    ListSimpleRecordHandler claims it → AttributeMatch([realms])
Handler:  resolves parent, iterates list entries via listEntry()
          for each entry, delegates children to provider chain via child().detachFromParent()
          renders as compact table (view) or editable table with modal form (edit)
Item:     1 table item, n entries × m children

Current State & Open Work ​

Coverage (WildFly 40) ​

Total attributes by storage and type (from model graph analysis):

StorageSTRINGBOOLEANINTLONGDOUBLEOBJECTLISTBYTESTotal
Configuration1,6281,0626132851930320714,118
— deprecated9672101—821—208
— active1,5329906032841929518613,910
Runtime5003183333531764100—1,685

Configuration OBJECT breakdown (303 total, 8 deprecated):

CategoryCountDeprecatedActiveHandler
Simple scalar value-type (maps)1780178MapHandler
Simple record (all simple sub-attrs)1110111FlatteningHandler
Complex (nested LIST/OBJECT children)1486Not yet covered

Configuration LIST breakdown (207 total, 21 deprecated):

CategoryCountDeprecatedActiveHandler
LIST of simple type (STRING, INT, etc.)17321152DefaultProvider
LIST of simple records (incl. LIST<simple> sub-attrs)27027ListSimpleRecordHandler
LIST with nested LIST<OBJECT>505Not yet covered
LIST with nested OBJECT202Not yet covered

The pipeline covers ~99% of simple/scalar attributes and ~95% of all configuration attributes. Excluding deprecated attributes (208 of 4,118), active coverage rises to ~97% with only 13 active uncovered attribute definitions remaining.

Runtime attributes are read-only, so even uncovered attributes render acceptably as plain text or JSON display.

Planned Handlers ​

The following handlers are planned but not yet implemented:

HandlerPatternCountDeprecatedActivePriorityExamples
List of Nested Complex ListsLIST of OBJECT with nested LIST<OBJECT> sub-attributes505MEDIUMmechanism-configurations, permission-mappings, constant-headers, services
List of Nested ObjectsLIST of OBJECT with nested OBJECT sub-attributes202MEDIUMserver-auth-modules, principal-query
Complex ObjectComplex/recursive OBJECTs with nested LIST/OBJECT children1486LOWfilter (logging, 8 resources, all deprecated — use filter-spec), identity-mapping, jwt, any/not (interface), attributes (console-access-log), new-item-template

The ListSimpleRecordHandler now covers LIST attributes with all-simple sub-attributes including LIST<simple> sub-attributes (e.g., role-map with its to: LIST<STRING>), pushing coverage past 95%. Excluding deprecated attributes, active coverage is ~97% with only 13 active uncovered attribute definitions remaining.

Implementation Details ​

The pipeline source code is in ui/src/main/java/org/jboss/hal/ui/resource/pipeline/, with comprehensive package-level Javadoc describing the architecture and data flow. Each handler documents:

  • Pattern recognition logic
  • Attribute claiming rules
  • Resolution strategy
  • Item production approach
  • Covered attributes with examples

Documentation for the HAL management console (halOP & halOS)