ArchStudio Concepts and Info:
Guide

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
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

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:

  • Components (the loci of computation),
  • Connectors (the loci of communication),
  • Interfaces (the exposed entry and exit points for components and connectors), and
  • Configurations (topological arrangements of components and connectors as realized by links).

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:

  • Architecture structure and types,
  • Product families (architectural versions, options, and variants), and
  • Implementation mappings (mappings from architecture types to their implementations).

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.

Section 2: Background

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.

xADL as an XML-based Language

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 (<) 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>

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:

<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>

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:

<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>

When XML is not absolutely necessary, we will use a very abbreviated, non-XML notation that just shows the data, hierarchically structured:

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

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.

Section 3: The Instances Core (xArch)

The core xADL schema is the instances schema, defined in the 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

The constructs defined in the instance schema are:

  • Component Instances (including sub-architectures)
  • Connector Instances (including sub-architectures)
  • Interface Instances
  • Link Instances
  • General Groups

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):

Instances Diagram

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), 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

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:

#id

Which would be the element with ID id in the current document. So, two examples of valid hrefs might be:

http://www.isr.uci.edu/foo/bar/archstudio.xml#ArchEdit
#ArchEdit (from within the file archstudio.xml)

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:

  • Component and connector instances each have a set of interface instances. These interface instances serve as the only interfaces to the component or connector instance that they belong to. That is, all data that passes from one component or connector instance to another travels through some interface. They are the "gateway" to the internals of the component or connector instance. This is not inconsistent with the object-oriented view of interfaces.
  • Link instance endpoints, while being generic XML links, are intended to link two interface instances. So, a link may link a particular "in" interface instance on component instance A to a particular "out" interface instance on connector instance B.
  • Link instances are not directional. The order of the points is irrelevant. Directional flow of data across a link is determined by the directions of interfaces linked ("in", "out", "inout", or "none").
  • Link instances should not be extended to add semantics on the links. If links had semantics, they would be connectors.

Notionally, in a boxes-and-arrows sense, the relationships between components, connectors, interfaces, and links can be seen in this diagram (example):

Box and arrow Diagram

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):

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"
    }
  }
}

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:

  1. An "archInstance": a full architecture specification of the internal architecture.
  2. A set of interface instance mappings: Which map interfaces on the internal architecture to interfaces on the external architecture.

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:

Interface instance Mappings

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.

Section 4: Modeling Architectural Structure

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.

Run-TimeDesign-Time
InstancesStructure

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):

Structure Diagram

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.

Section 5: The xADL Type System

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:

Instance
(Run-time)
Structure
(Design-time)
Type
(Design-time)
Component InstanceComponentComponent Type
Connector InstanceConnectorConnector Type
Interface InstanceInterfaceInterface Type
Link InstanceLink(None)
GroupGroup(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):

Types Diagram

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):

Signatures Diagram

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):

Subarchitecture without Interfaces

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:

Subarchitecture with a few Signatures

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:

Subarchitecture with a few signatures and Interfaces

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:

Subarchitecture with Signature-Interface Mappings

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.

Portions of this site Copyright © The Regents of the University of California. All Rights Reserved Worldwide. The development of ArchStudio was initially funded by the DARPA DASADA (Dynamic Assembly for Systems Adaptability, Dependability, and Assurance) program. The site now includes results from projects supported in part by National Science Foundation grants IIS-0205724 and CCF-0430066, The Boeing Company, and IBM.