Table of Contents

Overview

The Open MCT platform utilizes the framework layer to provide an extensible baseline for applications which includes:

Platform Architecture

While the framework provides a more general architectural paradigm for building application, the platform adds more specificity by defining additional extension types and allowing for integration with back end components.

The run-time architecture of an Open MCT application can be categorized into certain high-level tiers:

Diagram 1

Applications built using Open MCT may add or configure functionality in any of these tiers.

Application Start-up

Once the application has been initialized Open MCT primarily operates in an event-driven paradigm; various events (mouse clicks, timers firing, receiving responses to XHRs) trigger the invocation of functions, typically in the presentation layer for user actions or in the service infrastructure for server responses.

The "main point of entry" into an initialized Open MCT application is effectively the route which is associated with the URL used to access Open MCT (or a default route.) This route will be associated with a template which will be displayed; this template will include references to directives and controllers which will be interpreted by Angular and used to initialize the state of the display in a manner which is backed by both the information model and the service infrastructure.

Diagram 2

Presentation Layer

The presentation layer of Open MCT is responsible for providing information to display within templates, and for handling interactions which are initiated from templated DOM elements. AngularJS acts as an intermediary between the web page as the user sees it, and the presentation layer implemented as Open MCT extensions.

Diagram 3

Angular built-ins

Several extension categories in the presentation layer map directly to primitives from AngularJS:

Domain object representation

The remaining extension categories in the presentation layer are specific to displaying domain objects.

Information Model

Diagram 4

Domain objects are the most fundamental component of Open MCT's information model. A domain object is some distinct thing relevant to a user's work flow, such as a telemetry channel, display, or similar. Open MCT is a tool for viewing, browsing, manipulating, and otherwise interacting with a graph of domain objects.

A domain object should be conceived of as the union of the following:

Capabilities and Services

Diagram 5

At run-time, the user is primarily concerned with interacting with domain objects. These interactions are ultimately supported via back-end services, but to allow customization per-object, these are often mediated by capabilities.

A common pattern that emerges in the Open MCT Platform is as follows:

Concrete examples of capabilities which follow this pattern (or a subset of this pattern) include:

Diagram 6

Service Infrastructure

Most services exposed by the Open MCT platform follow the composite services to permit a higher degree of flexibility in how a service can be modified or customized for specific applications.

To simplify usage for plugin developers, the platform also usually includes a provider implementation for these service type that consumes some extension category. For instance, an ActionService provider is included which depends upon extension category actions, and exposes all actions declared as such to the system. As such, plugin developers can simply implement the new actions they wish to be made available without worrying about the details of composite services or implementing a new ActionService provider; however, the ability to implement a new provider remains useful when the expressive power of individual extensions is insufficient.

Diagram 7

A short summary of the roles of these services:

Object Service

Diagram 8

As domain objects are central to Open MCT's information model, acquiring domain objects is equally important.

Diagram 9

Open MCT includes an implementation of an ObjectService which satisfies this capability by:

Model Service

Diagram 10

The platform's model service is responsible for providing domain object models (effectively, JSON documents describing the persistent state associated with domain objects.) These are retrieved by identifier.

The platform includes multiple components of this variety:

Capability Service

Diagram 11

The capability service is responsible for determining which capabilities are applicable for a given domain object, based on its model. Primarily, this is handled by the CoreCapabilityProvider, which examines capabilities exposed via the capabilities extension category.

Additionally, platform/persistence/queue decorates the persistence capability specifically to batch persistence attempts among multiple objects (this allows failures to be recognized and handled in groups.)

Telemetry Service

Diagram 12

The telemetry service is responsible for acquiring telemetry data.

Notably, the platform does not include any providers for TelemetryService; applications built on Open MCT will need to implement a provider for this service if they wish to expose telemetry data. This is usually the most important step for integrating Open MCT into an existing telemetry system.

Requests for telemetry data are usually initiated in the presentation layer by some Controller referenced from a view. The telemetryHandler service is most commonly used (although one could also use an object's telemetry capability directly) as this handles capability delegation, by which a domain object such as a Telemetry Panel can declare that its telemetry capability should be handled by the objects it contains. Ultimately, the request for historical data and the new subscriptions will reach the TelemetryService, and, by way of the provider(s) which are present for that TelemetryService, will pass the same requests to the back-end.

Diagram 13

The back-end, in turn, is expected to provide whatever historical telemetry is available to satisfy the request that has been issue.

Diagram 14

One peculiarity of this approach is that we package many responses together at once in the TelemetryService, then unpack these in the TelemetryCapability, then repackage these in the TelemetryHandler. The rationale for this is as follows:

Diagram 15

The flow of real-time data is similar, and is handled by a sequence of callbacks between the presentation layer component which is interested in data and the telemetry service. Providers in the telemetry service listen to the back-end for new data (via whatever mechanism their specific back-end supports), package this data in the same manner as historical data, and pass that to the callbacks which are associated with relevant requests.

Persistence Service

Diagram 16

Closely related to the notion of domain objects models is their persistence. The PersistenceService allows these to be saved and loaded. (Currently, this capability is only used for domain object models, but the interface has been designed without this idea in mind; other kinds of documents could be saved and loaded in the same manner.)

There is no single definitive implementation of a PersistenceService in the platform. Optional adapters are provided to store and load documents from CouchDB and ElasticSearch, respectively; plugin authors may also write additional adapters to utilize different back end technologies.

Action Service

Diagram 17

Actions are discrete tasks or behaviors that can be initiated by a user upon or using a domain object. Actions may appear as menu items or buttons in the user interface, or may be triggered by certain gestures.

Responsibilities of platform components of the action service are as follows:

View Service

Diagram 18

The view service provides views that are relevant to a specified domain object. A "view" is a user-selectable visualization of a domain object.

The responsibilities of components of the view service are as follows:

Policy Service

Diagram 19

The policy service provides a general-purpose extensible decision-making mechanism; plugins can add new extensions of category policies to modify decisions of a known category.

Often, the policy service is referenced from a decorator for another service, to filter down the results of using that service based on some appropriate policy category.

The policy provider works by looking up all registered policy extensions which are relevant to a particular category, then consulting each in order to see if they allow a particular candidate in a particular context; the types for the candidate and context arguments will vary depending on the category. Any one policy may disallow the decision as a whole.

Diagram 20

The policy decision is effectively an "and" operation over the individual policy decisions: That is, all policies must agree to allow a particular policy decision, and the first policy to disallow a decision will cause the entire decision to be disallowed. As a consequence of this, policies should generally be written with a default behavior of "allow", and should only disallow the specific circumstances they are intended to disallow.

Type Service

Diagram 21

The type service provides metadata about the different types of domain objects that exist within an Open MCT application. The platform implementation reads these types in from extension category types and wraps them in a JavaScript interface.