xADL Distilled
A Guide for Users of the xADL Language
by Eric M. Dashofy
First Revision, April 2002. Last updated January 2003.
Table of Contents
Section 1: Introduction to xADL
Welcome to xADL! xADL (pronounced "zay-dul") is a highly-extensible software
architecture description language (ADL). It is used to describe various aspects of the architecture
of a software system. The architecture of a software system is its high-level
design; design at the level of components, connectors, and their configurations.
Like other ADLs such as Rapide, Darwin, and Wright, xADL's core models the four
most common architectural constructs, namely:
xADL is fairly unique among ADLs for several reasons. First, it was constructed
from the outset to be highly extensible. xADL is built as a modular language.
That is, it is defined not as a monolithic language in a single description, but rather
as a set of modules. The core module, which is mostly dedicated to describing components,
connectors, interfaces, and links, is the Instances Core, described later. xADL
also consists of a growing set of modules that add new modeling constructs or extend existing
ones. To date, xADL includes constructs that permit modeling of:
All these are covered in detail in later sections.
xADL's modules are defined as XML Schemas, making xADL an XML-based language.
All xADL documents (i.e. architecture descriptions) are XML documents that are valid
with respect to the xADL schemas.
In addition to the set of xADL schemas provided by U.C. Irvine, xADL can
be extended by end-users to optimize the language for particular domains. Tools are
available that provide users with support for both using existing modules (schemas)
and creating and manipulating their own extensions to xADL.
xADL builds upon a host of technologies and research data that have emerged
since the ostensible beginnings of software architecture research in the early 1990's.
First and foremost, xADL is an XML-based language. XML, the eXtensible Markup
Language, was originally created to annotate, or "mark up" text documents with semantic
information. Elements of text are marked up using tags, or special strings, that delimit
a section of text. Tags begin with an open angle-bracket ( To HTML users, this format may look familiar. This is because XML and HTML both share a common
historical ancestor, SGML (the Standard Generalized Markup Language). In HTML, however, there is
a finite set of allowed tags, each of which has a specific meaning dedicated to screen layout. So,
tags like <H1> in HTML indicate that a text element is to be laid out in the Heading 1 style
(usually large and bold, although this varies depending on the layout engine used), but do not
indicate any other semantics about the element--is it a story headline? Is it someone's name?
This information is not present in HTML.
This lack of a static set of allowed tags introduces a new problem into XML applications. What
tags are allowed and what do they mean? How do two parties sharing marked-up documents come
to an agreement on what elements are allowed, and where? How can they ensure that their information
is marked up in a consistent way that is meaningful to both of them?
The answer to this problem is to introduce a meta-language, a language for defining
languages. In XML, meta-languages define what elements are allowed, where they are allowed to
occur (and what their cardinality is), and what data may be part of each element. The XML 1.0
standard included such a meta-language, called the DTD (Document Type Definition) language.
The DTD meta-language was sufficient for expressing XML-based languages as a set of production
rules, much like a BNF (Backus-Naur Form) grammar, but proved insufficient for certain types
of applications. To remedy some issues that users had with DTDs, the W3C (World Wide Web Committee)
drafted a new meta-language for XML called XML Schema. XML schemas are more expressive than DTDs,
they have an XML-like syntax (DTDs do not), and they allow type relationships among element types
much like object-oriented inheritance.
The development of XML schemas made it much easier for developers to create and evolve XML-based
languages, and fostered the development of modular languages like xADL. A full treatment of
XML is far out of scope for this guide.
xADL's XML basis means that data in xADL is arranged hierarchically. Connections
between data elements that are not hierarchically arranged are managed using simple XML links;
xADL's tool support facilitates navigating these links.
As an XML-based language, xADL documents are readable and writable by hand, as simple
text documents. However, because xADL is defined in multiple schemas, each schema
having its own XML namespace, the actual code can get quite complicated. For example,
this is a real component description in xADL:
While editing xADL documents with a text editor is an option, doing so is really
only useful for point edits, rather than architecture description as a whole. However, we
do not view this as a disadvantage of the language. A text editor is a poor way to describe
an architecture, no matter how simple the language is. Instead, we provide powerful tools
with the xADL language to visualize and manipulate xADL documents, with both user
and programmatic interfaces. These tools are described in a later section.
Because of the complexity of the XML view of the language, actual language samples are not as
useful as they might be in an ADL that was intended for editing with a text editor. However,
when a language sample in XML is needed, it will be provided stripped of namespace information and
other extraneous tags for clarity's sake. For instance, the above component will be depicted
as:
When XML is not absolutely necessary, we will use a very abbreviated,
non-XML notation that just shows the data, hierarchically structured:
Previous work on ADLs such as Rapide, Wright, Darwin, SADL, and other ADLs focused on
creating languages that had a narrow, specialized semantic basis. Each language focused
on one or two particular features of architecture description and provided rich constructs
dealing with that feature. For instance, Rapide focuses strongly on event-based communication
between components and simulatable specifications, to the exclusion of other aspects of
software architecture. Each of these languages provided insights into a small number of
aspects of software architecture, but did not interoperate. Therefore, to take advantage
of each language's specialty, the architecture would have to be re-specified in each language
and analyzed using that language's tools.
A later effort to resolve these interoperability issues at Carnegie Mellon University
produced ACME, billed as an architecture interchange language. Rather than focusing on one
particular semantic basis, ACME focused on generality. It included a minimum set of first-class
constructs present in almost every ADL (boiling down to components, connectors, interfaces,
links, and first-class constraints), decorating each of these elements with a set of name-value
pair "properties." The vision was that ADL developers would write translators from their ADL
to ACME and back again. In this way, architects would be able to apply their tools to architecture
descriptions written in any language with an ACME translator.
Due to the large semantic differences among these architectures, this vision never became a
reality. Furthermore, the generic extensibility mechanism of property sets was not accompanied
by a way of standardizing which properties would be used, and what the format of the property
values would be (if any). Put another way, there was no meta-language over property sets. This
was later addressed to some extent by an early XML translation of ACME, ADML (promoted as an
Open Group standard).
From its inceptions, xADL was built to be an modular, extensible ADL. Instead of focusing
specifically on one particular semantic basis, xADL would allow semantic specialization through
language modules. Modules could be integrated together as necessary if their semantic
bases were compatible. xADL itself would evolve via the addition of modules to the set
of available xADL modules, but these modules would be made as orthogonal as possible so that
users of the language could adopt constructs as they were needed, rather than having to accept
the entire language in one "big bang" and subscribe to features or concepts that were unfamiliar
or incompatible with the target domain.
As such, xADL was not meant to address one specific semantic domain, but rather to serve
as the basis for experimenting with creating new domains, combining existing domains, experimenting
with different modeling constructs in existing domains, or modeling existing domains in a new,
more open format.
The core xADL schema is the instances schema, defined in the The constructs defined in the instance schema are:
All these things are grouped under a single top-level element called an ArchInstance element.
Each ArchInstance element corresponds to one conceptual architecture.
In xADL, the constructs in the instance schema are used to define running instances of
these things; that is, to provide a way to describe these constructs as part of a running software
system, rather than a system design. The general groups are intended to serve as collections of
xADL constructs, without any particular semantics at this stage. They could, for example,
describe things developed by the same author, or things that are running on the same machine in a
distributed system, or things that are written in the same programming language. Specializations
of this general group construct can be specified in extensions to the construct.
The XML relationships between these artifacts are shown in this diagram (click to enlarge in new
window):
A common theme throughout xADL, defined first in the instance schema, is that of IDs and
Descriptions. Many elements in xADL have an ID and/or a Description. Identifiers are assumed
to be unique to a particular document. They do not necessarily have to be human-readable, although it
helps if they are. Descriptions are intended to be human-readable identifiers of the described
constructs.
Furthermore, the instance schema defines an element type called an XMLLink that is used over
and over again in other xADL schemas. XMLLinks are links to other XML elements. xADL
borrows the linking strategy from the XLink standard. However, because of poor support for the
XLink standard in terms of real tools, xADL document authors are advised to follow the following
simplified convention for specifying XMLLinks.
In xADL, anything with an ID can be the target (i.e. the thing being pointed to) for an XMLLink.
Every XMLLink has two parts (implemented as XML attributes), This is a fairly standard fully-specified URL, linking to a document, but using the anchor
part of the URL (i.e. the part after the pound sign ('#')) to indicate the identifier of the specific
target element. Of course, if you are linking to an element in the same document, it is often
preferable to link using a relative URL, such as:
Which would be the element with ID id in the current document. So, two examples of
valid Semantics of the Instance Schema
An architecture instance is composed of sets of component, connector, and link instances, along with
a set of groups. Each component or connector instance has a set of interface instances (explained
below).
In addition to the hierarchical relationships here, we make a few additional assumptions about
how these elements can be arranged. These assumptions are:
Notionally, in a boxes-and-arrows sense, the relationships between components, connectors,
interfaces, and links can be seen in this diagram (example):
As you can see, the endpoints of the links are interfaces, and interfaces are the "gateway" to
the outside world for both components and connectors.
The above example architecture instance in xADL terms would be expressed as (in abbreviated,
non-XML notation):
An additional construct to address at this point is the instance schema's notion of
subarchitectures. Subarchitectures occur when a component or connector has an internal
architecture that is also described using constructs from the instance schema. When this occurs,
the "subarchitecture" element of the component or connector will contain:
For the balance of this discussion, we will talk about the subarchitecture of a component, but
what is detailed here can be equally applied to connectors with subarchitecture.
Interface instance mappings can be confusing at first, but are really quite simple. The point
is that there must be some way to associate interfaces on the outer component with interfaces on
some of the inner components or connectors. This creates a "bridge" between the higher-level (i.e.
outer) architecture and the lower level (i.e. inner) architecture. This is best illustrated with
a diagram:
In this diagram, we see a component with an internal architecture. The outer component has two
interfaces which are mapped to two interfaces on internal components. In theory, the mapped interfaces
are the "same" interface--that is, any data flowing in through the outer interface is passed to the
inner interface, and vice-versa. It is important to note that we assume that the outer component
does not provide any additional semantics not provided by its internal architecture; in other words,
the outer component is merely a shell. It does not provide any functionality in addition to that
of its internal architecture.
An obvious corrollary of this assumption is that hierarchically structured architectures really
are not hierarchically structured—that the outer components merely provide a way of grouping similar
internal architectures. In a sense, this is true, and implementors may choose to "flatten out" a
hierarchical architecture when implementing it.
The instances schema gives xADL the ability to model running instances of architectural
constructs like components, connectors, interfaces, and links. However, much work on software
architecture is centered around the design of the architecture, rather than capturing
properties of a running one.
For the purposes of this discussion, we make a distinction between architecture instances,
which exist at run-time, and structural elements, which exist at design-time.
Section 2: Background
Section 3: The Instances Core (xArch)
Section 4: Modeling Architectural Structure
Section 5: The xADL Type System
Section 6: Implementation Mappings
Section 7: Options and Variants
Section 8: Boolean Guards
Section 9: Versions
Section 10: Extending xADL
Section 11: xADL Tools
Section 12: Conclusion and Wrap-Up
Section 1: Introduction to xADL
Section 2: Background
xADL as an XML-based Language
<
) and end
with a closing angle-bracket (>
). In XML documents, tags generally
come in pairs, signifying the start and end of a text element. Start tags contain
a tag name immediately after the opening angle-bracket, and end-tags contain the
same name, prefaced by a forward slash (/
) immediately after the
opening angle-bracket. Elements may be nested as necessary, but may not overlap.
An example of some marked up text in XML might be:
<name><first>Herb</first> <last>Mahler</last></name>
<types:component xsi:type="types:Component" types:id="xArchADT">
<types:description xsi:type="instance:Description">xArchADT</types:description>
<types:interface xsi:type="types:Interface" types:id="xArchADT.IFACE_TOP">
<types:description xsi:type="instance:Description">xArchADT Top Interface</types:description>
<types:direction xsi:type="instance:Direction">inout</types:direction>
<types:type xsi:type="instance:XMLLink" xlink:type="simple" xlink:href="#C2TopType" />
</types:interface>
<types:interface xsi:type="types:Interface" types:id="xArchADT.IFACE_BOTTOM">
<types:description xsi:type="instance:Description">xArchADT Bottom Interface</types:description>
<types:direction xsi:type="instance:Direction">inout</types:direction>
<types:type xsi:type="instance:XMLLink" xlink:type="simple" xlink:href="#C2BottomType" />
</types:interface>
<types:type xsi:type="instance:XMLLink" xlink:type="simple" xlink:href="#xArchADT_type" />
</types:component>
<component type="Component" id="xArchADT">
<description type="Description">xArchADT</description>
<interface type="Interface" id="xArchADT.IFACE_TOP">
<description type="Description">xArchADT Top Interface</description>
<direction type="Direction">inout</direction>
<type type="XMLLink" xlink:type="simple" xlink:href="#C2TopType" />
</interface>
<interface type="Interface" id="xArchADT.IFACE_BOTTOM">
<description type="Description">xArchADT Bottom Interface</description>
<direction type="Direction">inout</direction>
<type type="XMLLink" xlink:type="simple" xlink:href="#C2BottomType" />
</interface>
<type type="XMLLink" xlink:type="simple" xlink:href="#xArchADT_type" />
</component>
component{
(attr) id = "xArchADT"
description = "xArchADT"
interface{
(attr) id = "xArchADT.IFACE_TOP"
description = "xArchADT Top Interface"
direction = "inout"
(xlink) type = "#C2TopType"
}
interface{
(attr) id = "xArchADT.IFACE_BOTTOM"
description = "xArchADT Bottom Interface"
direction = "inout"
(xlink) type = "#C2BottomType"
}
(xlink) type = "#xArchADT_type"
}
xADL as an Architecture Description Language
Section 3: The Instances Core (xArch)
instances.xsd
file.
This schema was created jointly by researchers at UC Irvine and Carnegie Mellon University. It defines
the "least common denominator" of architectural constructs and is semantically neutral. That is, it
does not take steps to define constraints or rules about these constructs or their behavior.
Constraints and the like are meant to be specified in extension schemas.
Constructs Defined in the Instances Schema
type
and
href
; these are defined by the XLink standard. For xADL XMLLinks, the type
field
should always be the string simple
, indicating a simple XLink. The href
field should be filled out with a URL such as:
http://
server/
directory/
document.xml#
id
#
id
href
s might be:
http://www.isr.uci.edu/foo/bar/archstudio.xml#ArchEdit
#ArchEdit
(from within the file archstudio.xml
)
archInstance{
componentInstance{
(attr) id = "comp1"
description = "Component 1"
interfaceInstance{
(attr) id = "comp1.IFACE_TOP"
description = "Component 1 Top Interface"
direction = "inout"
}
interfaceInstance{
(attr) id = "comp1.IFACE_BOTTOM"
description = "Component 1 Bottom Interface"
direction = "inout"
}
}
connectorInstance{
(attr) id = "conn1"
description = "Connector 1"
interfaceInstance{
(attr) id = "conn1.IFACE_TOP"
description = "Connector 1 Top Interface"
direction = "inout"
}
interfaceInstance{
(attr) id = "conn1.IFACE_BOTTOM"
description = "Connector 1 Bottom Interface"
direction = "inout"
}
}
componentInstance{
(attr) id = "comp2"
description = "Component 2"
interfaceInstance{
(attr) id = "comp2.IFACE_TOP"
description = "Component 2 Top Interface"
direction = "inout"
}
interfaceInstance{
(attr) id = "comp2.IFACE_BOTTOM"
description = "Component 2 Bottom Interface"
direction = "inout"
}
}
linkInstance{
(attr) id = "link1"
description = "Comp1 to Conn1 Link"
point{
(link) anchorOnInterface = "#comp1.IFACE_BOTTOM"
}
point{
(link) anchorOnInterface = "#conn1.IFACE_TOP"
}
}
linkInstance{
(attr) id = "link2"
description = "Conn1 to Comp2 Link"
point{
(link) anchorOnInterface = "#conn1.IFACE_BOTTOM"
}
point{
(link) anchorOnInterface = "#comp2.IFACE_TOP"
}
}
}
Section 4: Modeling Architectural Structure
Run-Time | Design-Time |
---|---|
Instances | Structure |
Structural constructs are defined in the xADL Structure and Types Schema, whose
filename is types.xsd
. This section addresses only the structure part of
the Structure & Types schema; types are addressed in a later section.
Constructs Defined for Modeling Architectural Structure
The xADL constructs available for modeling architectural structure mirror almost exactly those available for modeling architecture instances. The constructs defined in the instance schema are:
- Components
- Connectors
- Interfaces
- Links
- General Groups
Note that "component" is used as a structural construct, as opposed to "component instance," which is used to describe a run-time instance. Similarly, "connector," "interface," and "link" are used instead of "connector instance, "interface instance," and "link instance."
The XML relationships between these artifacts are shown in this diagram (click to enlarge in new window):

To elaborate, we will model the structure (design-time) of the same architecture we modeled above:
archStructure{ (attr) id = "My Structure" component{ (attr) id = "comp1" description = "Component 1" interface{ (attr) id = "comp1.IFACE_TOP" description = "Component 1 Top Interface" direction = "inout" } interface{ (attr) id = "comp1.IFACE_BOTTOM" description = "Component 1 Bottom Interface" direction = "inout" } } connector{ (attr) id = "conn1" description = "Connector 1" interface{ (attr) id = "conn1.IFACE_TOP" description = "Connector 1 Top Interface" direction = "inout" } interface{ (attr) id = "conn1.IFACE_BOTTOM" description = "Connector 1 Bottom Interface" direction = "inout" } } component{ (attr) id = "comp2" description = "Component 2" interface{ (attr) id = "comp2.IFACE_TOP" description = "Component 2 Top Interface" direction = "inout" } interface{ (attr) id = "comp2.IFACE_BOTTOM" description = "Component 2 Bottom Interface" direction = "inout" } } link{ (attr) id = "link1" description = "Comp1 to Conn1 Link" point{ (link) anchorOnInterface = "#comp1.IFACE_BOTTOM" } point{ (link) anchorOnInterface = "#conn1.IFACE_TOP" } } link{ (attr) id = "link2" description = "Conn1 to Comp2 Link" point{ (link) anchorOnInterface = "#conn1.IFACE_BOTTOM" } point{ (link) anchorOnInterface = "#comp2.IFACE_TOP" } } }
Semantics of Modeling Architectural Structure
The only significant difference between modeling architectural structure and architectural instances is the way that subarchitectures are handled. In the instances case, subarchitectures are expressed in-line, that is, as a sub-element of the component instance or connector instance. In the structural case, however, subarchitectures are handled through component and connector types, which are discussed in more detail later.
The rest of the semantics for modeling architectural structure are basically the same as those for
modeling instances. Namely, components and connectors are connected via links, whose endpoints
are interfaces, which are the gateways to components and connectors. Additional semantics
for structural elements are implied by the underlying type system, which is discussed in the
next section.
In the software architecture community, the precise meaning and usage of types is still
a hotly contested issue. Some approaches adopt a fairly traditional programming-language style
types-and-instances model. Others adopt a types-as-constraints model, where a type is simply
a constraint over elements; any element meeting that constraint is "of that type" (this implies
that a single element like a component or connector could potentially have many, many types).
xADL adopts the more traditional types-and-instances model found in many programming languages.
In this model, components, connectors, and interfaces all have types (called component types,
connector types, and interface types, respectively). Links do not have types because
links do not have any architectural semantics. The relationships between types, structure, and
instances are shown in the following table:
Section 5: The xADL Type System
Instance (Run-time) | Structure (Design-time) | Type (Design-time) |
---|---|---|
Component Instance | Component | Component Type |
Connector Instance | Connector | Connector Type |
Interface Instance | Interface | Interface Type |
Link Instance | Link | (None) |
Group | Group | (None) |
Components, connectors, and interfaces are typed because, in real software architectures, there may be multiple elements that are highly similar—perhaps they share behavior or an implementation. When designing xADL, we intended that types would be linked to implementations; as such, two structural elements (e.g. components) that shared a single type (e.g. component type) would imply that the two components shared an implementation (instantiated from the same class, perhaps, or were instances of the same shared library). However, this particular implication is not carried through in the language unless you choose to adopt the xADL implementation schemas, discussed later. Cases where two components or connectors might be of the same type include:
- When there are multiple, generic connectors (e.g. message buses) with identical behavior
- Multiple clients in a client-server system
- Redundant servers in a client-server system
- Two instances of the same component with different inputs (e.g. two instances of the "tee" command in a pipe and filter system).
- etc.
Constructs Defined for Architectural Types
The constructs available for modeling types are also defined in the Structure & Types schema,
along with the constructs for modeling structure. All the types-related constructs are grouped
under a top-level XML element called ArchTypes
.
The xADL constructs available for modeling architectural types are:
- Component Types
- Subarchitectures for Component Types
- Signatures
- Connector Types*
- Subarchitectures for Component Types
- Signatures
- Interface Types
The XML relationships between these constructs are shown in this diagram (click to enlarge in new window):

Semantics of Modeling Architectural Types
In xADL, all types are independent. Types are not composed of other types, nor is there (to date) a notion of subtyping or type inheritance in xADL. With appropriately documented semantics, however, type inheritance could easily be added through a new schema.
Signatures
One of the least intuitive constructs in xADL is the signature. Each component or connector type has a set of signatures. Each signature has a direction (like interfaces do) and a type XLink, which is intended to point at an interface type. The rationale behind signatures is as follows: let's assume there is are two components C1 and C2, of type T. Certainly, C1 and C2 share something in common, most likely a behavior or an implementation. If this is true, then both C1 and C2 should expose the same types of interfaces (i.e. C1 and C2 should each have the same number of interfaces, and those interfaces should be of the same type. If I find an interface C1-I1 on component C1, I should be able to find a corresponding interface of the same type C2-I1 on component C2). The signatures in the component type T prescribe what types of interfaces must exist on a component of type T for that component to properly be "of that type." This is illustrated here in a diagram (click to expand in new window):

Dotted lines represent the "type" XLink on the various elements. This diagram illustrates the relationship between structural constructs, interfaces, types (especially interface types), and signatures. In the diagram, two components (C1 and C2) share a type, T1. The type has two signatures, Sig1 and Sig2, of interface types TopType and BottomType, respectively. Thus, the two components each have interfaces of types TopType and BottomType. This is a valid arrangement of structural elements, types, and signatures.
However, it is important to note that there is nothing in XML that can guarantee or constrain the various "types" XML links such that only valid arrangements of these constructs can be created. This has advantages and disadvantages. The obvious disadvantage is that this additional validity constraint must be verified by external tools, and cannot be verified solely by XML tools or by the structure of the language itself. The advantage is that the lack of a language-induced constraint here means that different xADL users have the opportunity to redefine the semantics of signatures (or ignore them entirely) if that makes sense in their target domain.
Signatures also play a role in design-time subarchitectures, described below.
At this point, it is possible to look at how the example in the above example would be specified in xADL (using pseudo-XML notation):
archStructure{ (attr) id = "My Structure with Types" component{ (attr) id = "C1" description = "Component C1" interface{ (attr) id = "comp1.IFACE_TOP" description = "Interface C1-Top" direction = "inout" (link) type = "#TopType" } interface{ (attr) id = "comp1.IFACE_BOTTOM" description = "Interface C1-Bottom" direction = "inout" (link) type = "#BottomType" } (link) type = "#T1" } component{ (attr) id = "C2" description = "Component C2" interface{ (attr) id = "comp2.IFACE_TOP" description = "Interface C2-Top" direction = "inout" (link) type = "#TopType" } interface{ (attr) id = "comp2.IFACE_BOTTOM" description = "Interface C2-Bottom" direction = "inout" (link) type = "#BottomType" } (link) type = "#T1" } } archTypes{ componentType{ (attr) id = "T1" description = "Component Type T1" signature{ direction = "inout" (xlink) type = "#TopType" } signature{ direction = "inout" (xlink) type = "#BottomType" } } interfaceType{ (attr) id = "TopType" description = "Type for Top interfaces on Components" } interfaceType{ (attr) id = "BottomType" description = "Type for Bottom interfaces on Components" } }
Design-Time Subarchitectures
Recall that, in xADL run-time, or instance models, subarchitectures (internal architectures of component or connector instances) are modeled in-line; that is, the specification of the internal component or connector architecture is part of the specification of the outer component or connector.
When a type system is introduced, however, things become more complicated. It stands to reason that two components or connectors of the same type would have similar internal architectures. In xADL, this is the case—internal architectures are associated with types rather than structural elements like components or connectors. Thus, two components or connectors who share a type will also have the same internal architecture (if any).
As an example, consider this client-server architecture diagram (connectors, interfaces, and signatures removed for simplicity, click to enlarge in separate window):

In this diagram, the server has an atomic type—that is, the type is not broken down any further. However, the two clients share a type, and they also share a subarchitecture (two linked components called UI and Logic). Conceptually, this works well, but when interfaces, signatures, and interface types become involved, things become more complicated.
Just as an atomic component/connector type has signatures that prescribe what kinds of interfaces a component or connector of that type will have, a composite component/connector type (one with a subarchitecture) also has signatures. So, we will add signatures to the composite type in the above diagram as such (note that many signatures/interfaces are still being omitted for clarity). Note also that the signature's types have been omitted:

Like the outer architecture, the inner architecture will also have interfaces. Interfaces for the inner architecture have been added in this diagram (other signatures, interfaces still omitted for clarity). Also note that the types for these interfaces exist, but have been omitted as well:

Now we need to map the signatures on the component type to interfaces on the subarchitecture. These mappings are given with Signature-Interface Mappings, analogous to the InterfaceInstanceMappings described above for the instance schema. We add signature-interface mappings to the diagram here:

Because of this mapping, it is assumed that the mapped signature and interface have the
same interface type for reasons of consistency. In xADL terms, let's model the component
type client_type
in pseudo-XML notation, incluiding all interface types
and signatures (but ignoring the rest of the outer architecture
for simplicity).
archTypes{ componentType{ (attr) id = "client_type" description = "Client Type" signature{ (attr) id = "logic_signature" description = "Logic Signature" direction = "inout" (xlink) type = "#LogicInterfaceType" } signature{ (attr) id = "ui_signature" description = "UI Signature" direction = "inout" (xlink) type = "#UIInterfaceType" } subarchitecture{ (xlink) archStructure = "#client_architecture" signatureInterfaceMapping{ (xlink) outerSignature = "#logic_signature" (xlink) innerInterface = "#logic_interface" } signatureInterfaceMapping{ (xlink) outerSignature = "#ui_signature" (xlink) innerInterface = "#ui_interface" } } } interfaceType{ (attr) id = "LogicInterfaceType" description = "Logic Interface Type" } interfaceType{ (attr) id = "UIInterfaceType" description = "UI Interface Type" } interfaceType{ (attr) id = "LogicUIBridgeInterfaceType" description "Logic UI Bridge Interface Type" } componentType{ (attr) id = "client_ui_type" description = "Client UI Component Type" signature{ (attr) id = "client_ui_signature" description = "Client UI Signature" direction = "inout" (xlink) type = "#UIInterfaceType" } signature{ (attr) id = "client_logic_ui_bridge_out_signature" description "Client Logic-UI Bridge Signature, UI Side" direction = "out" (xlink) type = "#LogicUIBridgeInterfaceType" } } componentType{ (attr) id = "client_logic_type" description = "Client Logic Component Type" signature{ (attr) id = "client_logic_signature" description = "Client Logic Signature" direction = "inout" (xlink) type = "#LogicInterfaceType" } signature{ (attr) id = "client_logic_ui_bridge_in_signature" description "Client Logic-UI Bridge Signature, Logic Side" direction = "in" (xlink) type = "#LogicUIBridgeInterfaceType" } } } archStructure{ (attr) id = "client_architecture" description = "Client Architecture" component{ (attr) id = "client_ui_component" description = "Client UI Component" interface{ (attr) id = "client_ui_ui_interface" description "UI Interface on Client UI" direction = "inout" (xlink) type = "#UIInterfaceType" } interface{ (attr) id = "client_logic_ui_bridge_out_interface" description = "Client Logic-UI Bridge Interface, UI Side" direction="out" (xlink) type= "#LogicUIBridgeInterfaceType" } } component{ (attr) id = "client_logic_component" description = "Client Logic Component" interface{ (attr) id = "client_logic_logic_interface" description = "Logic Interface on Client Logic" direction = "inout" (xlink) type = "#LogicInterfaceType" } interface{ (attr) id = "client_logic_ui_bridge_in_interface" description = "Client Logic-UI Bridge Interface, Logic Side" direction = "in" (xlink) type = "#LogicUIBridgeInterfaceType" } } link{ (attr) id = "client_logic_to_ui_link" description = "Client Logic to UI link" point{ (xlink) anchorOnInterface = "#client_logic_ui_bridge_in_interface" } point{ (xlinK) anchorOnInterface = "#client_logic_ui_brige_out_interface" } } }
You will note in the above document that there is only one archTypes section, even though two levels of architectural hierarchy are being modeled here (the upper level represented by the client type and the lower level being represented by its subarchitecture). Because types are seen as independent entities, not necessarily bound to a single architecture or level of the hierarchy, they are grouped up in this fashion. This is normal. The exception would be if the architecture in which the client type is included and its internal architecture were modeled in different xADL files; in this case there would likely be one archTypes section in each file, although this is for organizational, rather than semantic, purposes.
Contact Us
If you have questions not answered by this website, please feel free to
contact the software architectures group at UC Irvine through the
ArchStudio developer's (mailman protected) email list at:
archstudio-dev [@] uci
[.] edu.