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}8
4PathRelativeToHandlersibling path + relative-to STRING pairs31
5MapHandlerOBJECT with simple scalar VALUE_TYPE222
6FlatteningHandlersimpleRecord OBJECTs (all simple sub-attributes)~80

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

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

Current State & Open Work

Coverage (WildFly 40)

The pipeline covers ~93% of all 5,803 attributes (~5,387 attributes):

StorageTotalCoveredNot CoveredCoverage
Configuration4,118~3,909~209~95%
Runtime1,685~1,478~207~88%

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:

HandlerPatternCountPriority
List of Simple RecordsLIST of OBJECT with simple-type sub-attributes19HIGH
List of Nested ListsLIST of OBJECT with nested LIST sub-attributes8MEDIUM
List of Nested ObjectsLIST of OBJECT with nested OBJECT sub-attributes1MEDIUM
Complex ObjectComplex/recursive OBJECTs (not lists)7LOW

These represent the remaining 7% of uncovered attributes. Implementing the high-priority "List of Simple Records" handler would push coverage past 95%.

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)