The OMNIA platform was designed based on the theoretical principles of language design and model-driven engineering, following similar principles to the Object Management Group’s standard of Meta-Object Facility (MOF) and its related languages such as the Eclipse Modeling Framework (EMF) and the Unified Modeling Language (UML).
Here we explain what the different languages that exist in the platform are, as well as introducing our analogue to MOF, the Meta-Entity Framework (MEF).
2. Meta-Entity Framework
MEF is the type system that all the languages on the platform use. If we were to identify the different layers of an OMNIA application, we could say that the application itself is layer 0 (M0), the model of that application is layer 1 (M1), and the languages of the platform (the meta-meta model) are layer 2 (M2). MEF is a layer above those languages, M3.
An alternative way to describe MEF would be saying that it is a Domain-Specific Language used to define metamodels in OMNIA.
2.1. MEF Objects
This section describes extensively all of the objects of MEF.
A Classifier is the base object type for all M3-level classes.
|Name||Text||1..1||The name of the entity represented by this classifier.|
A Type is a classifier that defines an object type. There are three different kinds of Type: Class, Enumeration and Primitive.
|Kind||Enumeration||1..1||The kind of this type: Class, Enumeration or Primitive.|
126.96.36.199. Data Type
The Data Type is a subset of the Type. It has the same properties as it, but only contains the Enumeration and Primitive.
The Class is the object type that is most frequent in the below layers. It defines a series of Properties and Operations, which can be understood as similar to Attributes and Methods in Object-Oriented Programming (OOP) classes.
|InstanceOf||Text||1..1||The kind of this type: Class, Enumeration or Primitive.|
|Properties||Property||1..*||The list of all the properties of this class.|
|Operations||Operation||1..*||The list of all the operations of this class.|
The Enumeration is the object type that represents a fixed list of possible values.
|Values||Text||1..N||List of all the possible values for the enumeration.|
The Primitive represents a basic data type in our languages. It is where we define mappings between language concepts (such as Text) and primitive types (such as string) in the programming language used to implement MEF.
It has the same properties as DataType.
188.8.131.52 List of Primitives
- Boolean (i.e. bool in C#)
- Date (i.e. DateTime in C#)
- Decimal (i.e. decimal in C#)
- Integer (i.e. int in C#)
- Text (i.e. string in C#)
- Uuid (i.e. Guid in C#)
The Property is, as mentioned above, a similar concept to an Attribute in OOP, representing a strongly-typed value of a Class.
|Name||Text||1..1||Name of this property.|
|Multiplicity||Multiplicity||1..1||Multiplicity of this property, i.e. the number of values its PropertyType will accept.|
|PropertyType||Type||1..1||Base type of this property - whether this will be a list or not, or nullable, depends on multiplicity.|
|AggregationKind||Aggregation Kind||1..1||Aggregation kind of this property’s type.|
|IsIdentifier||Boolean||1..1||Whether or not this property represents a unique identifier for the Class it’s in. A class must have one and only one identifier.|
|IsDerived||Boolean||1..1||Whether or not this property is calculated by an expression.|
|Expression||Text||0..1||If the property is derived, this is the expression that calculates it.|
2.1.6. Aggregation Kind
An Aggregation Kind is used to describe a relationship between a Class and another Class. There are three types of aggregation:
- Composite: The relationship is assymetric: if a property is Composite, it means the other class will exist only in the context of this class, as an instance.
- Shared: The relationship is a reference: we store only a copy of the identifier to the other class.
- None: A non-aggregate relationship is a looser form of binding. In the context of MEF, used exclusively for references to Data Types (Enumerations and Primitives).
Multiplicity refers to the upper and lower bounds on the number of values accepted for a given property.
|Lower||Integer||1..1||The lower bound on the number of accepted values. If 0, this property will be optional.|
|Upper||Integer||1..1||The upper bound on the number of accepted values. If > 1, this property represents a list of values. Cannot be higher than Lower.|
The Operation is, as mentioned above, analogous to a method in OOP, representing an execution of user-modeled code at a given time.
|Name||Text||1..1||Name of this operation.|
|Event||Event||1..1||Event to which this operation is associated.|
|Expression||Text||1..1||The expression that represents the body of the operation.|
The Event is what identifies when an Operation will execute.
|Type||Event Type||1..1||The type of event this event is in, i.e., when it executes.|
|Property||Property||0..1||If the event type requires a property (i.e. if happens on change of one), which property is it.|
184.108.40.206. Event Type
- Initialize: On creation of a class.
- BeforeChange: Before changing any property in a class.
- Change: When changing a specific property of a class.
- AfterChange: After changing any property in a class.
- Finalize: When explicitly finishing to change a class (saving).