Newbie / General

Questions in this section are directed at those that are new to the Eclipse OCL component and are interested in finding out how to begin working with it.

What is Eclipse OCL?

Eclipse (MDT) OCL provides a parser and interpreter for OCL constraints and
expressions on any EMF-based metamodel. By that is meant any
metamodel whose meta-metamodel is Ecore, and which (in being a metamodel)
provides an EMF importer to create GenModels that generate a Java
implementation.

So far, the Eclipse Modeling Project has two such metamodels: Ecore and UML
(Ecore being its own meta-metamodel). Hence, the OCL component provides an
OCL binding for each of these metamodels. OCL can parse constraints in
either Ecore or UML models, and can evaluate them on the instances of Java
classes generated from these models.

In terms of the OMG's modeling "stack", then, we have in the Eclipse
Modeling Project

How do I workaround org.eclipse.emf.ocl deprecation in Helios and later?

The deprecated org.eclipse.emf.ocl feature and plugin were removed in the MDT/OCL 3.0.0
release. Unfortunately some projects, notably UML2-Tools, continue to reference it. This
prevents their Galileo releases being installed on Helios. A Helios release of UML-Tools
has been built (26-July-2010) but its visibility from
The UML2-Tools Downloads Page is
not quite right yet.

[Attachment] to
[Bug 318941] provides
a ZIPped update site containing just enough of org.eclipse.emf.ocl to satisfy
the installation requirements of org.eclipse.emf.ocl dependents.

Therefore to install e.g. UML2-Tools

Install MDT/OCL 3.0.0 (most conveniently as part of the Eclipse Modeling Package)

Do not install anything else after UML2-Tools since org.eclipse.emf.ocl-update.zip effectively claims that Galileo and Helios are compatible undermining p2's ability to install consistent plugins.

How do I solve: "#" unexpected character ignored

In OCL 1.3 a '#' character was used to indicate an enumeration value, and so there are misleading examples such as

self.allConnections->select(aggregation <#none)->size <= 1

from Section 2.5.3 of UML 1.5 that suggest that # is a prefix for an Enumeration Literal. This syntax was removed in OCL 2.0.

Enumeration Literals should be qualified by their Enumeration name: e.g. AggregationKind::none.

OCL Formulation

This section answers common problems in the formulation of OCL expressions that achieve some specific aim. More often than not, these are matters of OCL-the-language, not specific in any way to the MDT implementation.

How do I combine collections of different types?

If you have two or more collections of distinct element types and want to combine them into a single collection, it is not as simple as just unioning them or casting the collections to a common type. In the OCL 2.0 specification, the collection types do not conform to OclAny, so they do not have the oclAsType operation. Also, the semantics of generic type parameters in collections are undefined, so that it is not clear whether, for example, Set(T) has only union(Set(T)) or also union(Set(S)) where S is any supertype of T.

which works because Set(S) has an operation union(Set(S)) that accepts arguments of type Set(A) and Set(B) because of the rules of conformance of collection types.

How do I invoke methods such as eContainer(), eContents(), eGet()?

These methods are EObject methods, so you need to declare that your meta-model extends EObject. Therefore you need to initialize your environment with the following ParsingOption declaration prior to parsing.

(Prior to EMF 2.5.0M4 this declaration was not necessary if your meta-model explicitly inherited from an Ecore class such as EModelElement or EObject.)

The oclContainer() and oclContents() methods have been proposed as the long term solution for the specification gap between OCL, UML and MOF. These methods are available when using the modelled OCL Standard Library that forms part of the Xtext editoir support for the Indigo release.

How do I access unnavigable opposites in Ecore

In UML, when an association may be drawn with a unidirectional arrow, the association is intended only to be navigated in one direction. It is however permissible for an OCL constraint to navigate in the reverse direction, using an (opposite) role name. The (opposite) role name may be explicitly specified. If the (opposite) role name is omitted, an implicit (opposite) role name is computed from the name of the target class. OCL 2.2 specifies that this name converts the first letter of the target class name to lower case and MDT/OCL 3.0.0 follows this specification.

(UML specifies that the target class name is used as-is. The OCL specification should change to align with UML and MDT/OCL will change too.)

When the UML-binding of MDT/OCL is used, navigation of unnavigable opposites works as specified.

For EMOF meta-models, the OCL specification leaves support for unnavigable opposites as an optional compliance point. It is is difficult for an OCL implementation to support unnavigable opposites since the EMOF meta-model does not provide the required opposite role name. Only the implicit opposite role name could be used. (There are ongoing discussions about introducing a Tag into the EMOF meta-model to persist this information.) It is also difficult for an OCL AST to persist the referredProperty reference to a Property that does not exist.

MDT/OCL 3.0.0, when using Ecore meta-models which have similar limitations to EMOF, therefore fails to support unnavigable opposites. However all is not quite lost.

In [Bug 229998] a solution to the oppositeRoleName persistence problem was introduced using either an Ecore EAnnotation or an EMOF Commented Comment. In [Bug 251621] an additional plugin has been contributed solves the AST problem with an additional OppositePropertyCallExp class. So if you install the extra plug-in and arrange for your Ecore meta-model source to use the EAnnotation, you can use unnavigable opposites.

It is anticipated that a more integrated solution will be available in MDT/OCL 4.0.0.

Embedded OCL Issues

This section answers problems that may arise when OCL is used within other tools

Standalone

The Eclipse OSGI framework ensure that many important initializations occur automatically. If you are operating in a standalone environment, such as a JUnit test, an MWE script, or an Xtext generated compiler you must orchestrate the initialization manually.

For an Xtext generated compiler, the above code can be placed in YourStandaloneSetup.register().

Xtext

An object may not circularly contain itself

This error arises when the root object in a model is validated twice, since validation of the root object marks itself as already validated causing the second validation to report a circular validation.

Solution: make sure that registerForImportedPackages is false in your MWE2 editor generation script.

OCL Code Generation

How do I generate code from OCL constraints in Ecore?

As of EMF 2.6.0M4 and MDT/OCL 3.0.0M6 EClassifier invariants, EOperation bodies and
EStructuralFeature initial or derived values may be specified using OCL expressions embedded
as Ecore annotations within an Ecore meta-model. These expressions may be evaluated either after
genmodel has been used to convert your model to Java, or directly using the dynamic
capabilities of EMF.

These editors use a different parser to the MDT/OCL core and use a modeled OCL standard library, which is slightly closer to the OCL standard. These example editors provide a preview of the fully integrated functionality that should be available in Indigo. Currently none of these editors can generate an AST, which is less of a problem than it might seem. The editors can be used to maintain the textual OCL representation that can then be passed to the OCL facade for parsing and evaluation. This is particularly useful in the OCLinEcore editor where the OCL persistence is textual. However beware that the editors have limited semantic validation and may report different errors to the core LPG parser.

M2M/QVTd Editors

An editor for OCL has been developed as part of the M2M/QVT Declarative
project. This reuses the MDT/OCL LPG parser and so editor and execution have few discrepancies. The editor and accompanying builder can be configured to produce an OMG-like AST automatically.

Open org.eclipse.qvt.declarative.examples.ocl.royalandloyal/oclsrc/Royal and Loyal/Royal and Loyal.ocl.

An empty prototype project may be created by

Invoke New->Project->Examples->QVT Projects->Empty OCL Project

The important characteristics of this project are that:

The Java build path specifies 'oclsrc' and 'oclbin' folders.

The QVTd Model Registry Nature is set enabling the Model Registry Property Page to
define models that contribute to the OCL 'package' path.

The QVTd OCL Nature is set enabling compliation of the OCL src to an OCL bin AST.

OCLinEcore editor fails to initialize due to a missing ModulemapPackage class

This problem is caused by the spurious registration of org.eclipse.jst.j2ee.internal.earcreation.modulemap.ModulemapPackage for modulemap.xmi. Since this class does not exist, any code that peruses the EMF Package registry gets a run-time exception that it probably does not handle, so a loop terminates. This occurs when Xtext starts up for OCLinEcore.

For Helios, Bug 320417 is registered against WTP, and Bug 320420 against Xtext. Both are likely to be fixed in Helios SR1. The workaround for Helios is not to install the JST plugin, typically used by the Web Page editor.

OCL Runtime

Stand-alone Tracing

Since the 1.1 release, MDT OCL has supported a stand-alone deployment. However, debug tracing has always been an all-or-nothing deal, activated by the org.eclipse.ocl.debug system property. Now, finer-grained control is available using system properties named according to the OCL plug-in's trace options. For example, to trace only evaluation of expressions (not also parsing and other activity), use -Dorg.eclipse.ocl/debug/evaluation=true.

UML 2.4 migration

The Juno (MDT/UML2 4.0, MDT/OCL 4.0) is aligned with UML 2.4 rather than UML 2.2. The following differences may be apparent.