blob: 33659f5034b5941694961678f1d1a40e642c6c72 [file] [log] [blame]
h1. Overview and Getting Started
For a quick demonstration of OCL enrichment of an Ecore meta-model with computed constraints go to "Getting Started":#GettingStarted.
A PDF version of this documentation is available at "OCL 2021-03 (6.15.0) Documentation":http://download.eclipse.org/ocl/doc/6.15.0/ocl.pdf.
h2. What is OCL?
* _EMF is Modeled Structure_
The Eclipse Modeling Framework (EMF(Eclipse Modeling Framework)) supports the definition of structural meta-models and the subsequent use of models conforming to these meta-models. EMF also supports generating of Java code to represent the meta-models. Additional Java code can be provided to add behavior to the structural meta-models.
* _OCL is EMF and Modeled Behavior_
OCL(Object Constraint Language) provides a modeling language that allows the behavior to be embedded within the structural meta-models or provided as a complement to those meta-models. As a modeling language, OCL understands the models and so OCL code is much more compact than the equivalent Java. OCL code can be statically checked, whereas the corresponding Java code often uses reflection and so cannot be checked.
Eclipse OCL is an implementation of the OMG OCL 2.4 specification for use with Ecore and UML meta-models.
h2. How Does It Work?
OCL is a programming language, so you will want to edit it, execute it and debug it.
h3. Editing
Eclipse OCL supports entry of semantically checked OCL expressions
* embedded within Ecore using the "OCLinEcore":#OCLinEcore editor
* as complementary documents using the "Complete OCL":#CompleteOCL editor
* interactive entry and evaluation using the "Interactive OCL":#InteractiveOCL console.
* programmatic entry and evaluation using the "Java API":#ProgrammersGuide
EMF supports entry of unchecked OCL
* embedded within Ecore using the Sample Ecore Editor properties view
Eclipse UML supports entry of unchecked OCL
* embedded within UML OpaqueExpressions using the UML Model Editor properties view
"Papyrus":#OCLinPapyrus supports entry of semantically checked OCL expressions
* embedded within UML OpaqueExpressions using the "Essential OCL":#EssentialOCL editor
h3. Execution
Eclipse OCL supports OCL execution
* interactive entry and evaluation using the "Interactive OCL":#InteractiveOCL console.
* programmatic entry and evaluation using the "Java API":#ProgrammersGuide
EMF support for generated models enables OCL execution of
* constraints, operation bodies and property initializers using the "Java API":#ProgrammersGuide
EMF support for dynamic models enables OCL execution of
* constraints using the "Validation Delegate":#ValidationDelegate API
* operation bodies using the "Invocation Delegate":#InvocationDelegate API
* property initializers using the "Setting Delegate":#SettingDelegate API
* queries using the "Query Delegate":#QueryDelegate API
All OCL execution is normally interpreted and starts from the OCL source text (Concrete Syntax). There is therefore a first time parsing overhead to create the compiled form (Abstract Syntax). The compiled form is cached to avoid repeated parsing costs.
Altenatively the direct Java code generator may be used as described in the "Code Generator Tutorial":#CodeGenerationTutorial.
h3. Debugging
Since OCL is used embedded in a larger environment, debugging is not easy to provide for OCL in isolation. The "OCL debugger":#Debugger provides a variety of launch mechanisms that enable re-use of model element and/or constraint selections.
Alternatively the following approaches may be useful within other toosl
* use the hover-text in the semantic editor to understand the expression types
* use the quick-fixes in the semantic editor for possible corrections
** if the same fix is suggested more than once, try restarting the editor
* use the completion assist in the semantic editor for possible syntaxes
* use intermediate invariants to check partial results
* use the optional explanation messages for an invariant to provide a 'printf'
* use the "Interactive Xtext OCL":#InteractiveOCL console to practice a problematic expression on a model
h3. Testing
Once again, since OCL is used embedded in a larger environment, testing is not easy to provide for OCL in isolation. The following approaches may be useful.
* use the "Interactive Xtext OCL":#InteractiveOCL console to practice sub-expressions of a problematic expression on a model
The Eclipse OCL development uses an extended JUnit framework that allows the Eclipse OCL code to be tested by assertions such as:
bc.
assertQueryInvalid(null, "let b : Boolean = null in true and b");
assertQueryResults(null, "Set{'b'}", "Set{'a', 'b', 'c'} - Set{'c', 'a'}");
(The null first argument may be a context object.)
See the org.eclipse.ocl.xtext.tests plugin for further details.
h2. Eclipse OCL is Extensible
The Classic Eclipse OCL is used as a component in a variety of other Eclipse projects such as Acceleo, BIRT, GMF, Modisco, QVTo. Ecore models are used directly, which leads to some internal difficulties.
The new Unified Eclipse OCL exploits Xtext and uses Ecore models indirectly via a UML-aligned Pivot models. This provides a choice between the classic APIs that offer limited forward functionality, and the new APIs that some of which are promoted to non-experimental form in the Mars release. Many remain experimental and internal.
The new code already offers a fully modeled Standard Library that can be extended or replaced. The new OCL grammars are extended internally from Essential OCL to OCLinEcore or Complete OCL, and externally to QVT Core and QVT Relational. The associated Concrete Syntax to Abstract Syntax mapping is not yet model-driven and so harder to extend.
Full model-driven extensibility is planned for a future release.
h2. Who Uses OCL and Eclipse OCL?
The OCL specification is defined by the OMG(Object Management Group). It originally evolved as part of UML(Unified Modeling Language) where it is used for the detailed mathematical aspects that are not appropriate for graphical exposition. OCL 2.0 was split off from UML 2.0 in recognition of its greater utility.
Within the OMG context, OCL has been re-used as the foundation for the MOFM2T(Model to Text) Model-to-Text transformation language and the QVT(Query View Transformation) Model-to-Model transformation language. Eclipse implementations of these are available as the Acceleo and QVT Operational projects.
Eclipse OCL is an implementation of the OCL specification for use in conjunction with EMF and in particular Ecore and UML2 meta-models. As the behavioral extension for EMF, Eclipse OCL can be used wherever EMF can.
As a specification language, OCL is frequently used when the behavior of models is formally specified.
The use of OCL as an execution language has been hindered by the quality of tool support. Beyond the research domain, many usages have been proprietary. One advanced proprietary usage at SAP has been contributed to Eclipse OCL and is available as the "Impact Analyzer":#ImpactAnalyzer. This supports strategic planning of run-time notifications so that derived model properties can be updated efficiently in response to a change to a model. Thousand-fold speed improvements are achievable on large models using OCL rather than Java because OCL has a formal model-based semantics that is amenable to analysis.
The use of OCL in general is eased by the provision of good editors exploiting Xtext to provide comprehensive semantic feedback in a familiar editing style.
The use of OCL for execution is enhanced by providing direct Java code generation for OCL embedded in models. This should alleviate many of the performance concerns for interpreted execution of embedded OCL.
Debugging of OCL execution is now possible using the OCL debugger and the OCL Console can be used for OCL experimentation.
h2. Who is Behind Eclipse OCL?
Eclipse OCL is an Open Source project. The original code for OCL 1.x was contributed by IBM. It has evolved to support OCL 2.x under the auspices of Eclipse.
There is now a significant personnel and corporate overlap between the Eclipse OCL committers and the OMG OCL RTF(Revision Task Force) and so Eclipse OCL is pioneering solutions to many of the under-specification problems in the OCL specification.
You can expect future changes in OMG OCL to have an implementation in Eclipse OCL to demonstrate their viability. It is likely that the next version of the OCL specification will use Eclipse OCL and M2T(Model to Text) tooling to eliminate inconsistencies. Eclipse OCL is currently in use to check that the OCL used in the UML 2.5 specification is syntactically and semantically correct.
Direct tooling of the UML 2.5 and OCL 2.5 specifications for a future Eclipse release may demonstrate that the OCL aspects of the specifications is also functionally consistent.
h2(#GettingStarted). Getting Started
For a very quick demonstration of OCL, you may follow this very abbreviated version of the "OCLinEcore tutorial":#OCLinEcoreTutorial, where you can find "Installation":#Installation instructions. Once you have the OCL Examples and Editors feature installed you may follow these instructions to get an insight into the capabilities of OCL and the Eclipse OCL tooling.
Invoke *File->New->Project...* then select *Examples* then *OCL (Object Constraint Language) Plugins* then *OCLinEcore Tutorial* and *Finish* to create a small example project called *org.eclipse.ocl.examples.project.oclinecoretutorial*. It contains
* *model/Tutorial.ecore* - a small Library meta-model
* *model/Tutorial.xmi* - an even smaller Library model
* *model/Tutorial.genmodel* - a gebnerator for Java code
Select *model/Tutorial.ecore* and use the right button to invoke *Open With->OCLinEcore Editor*. This gives you a textual view of the Ecore file with embedded OCL invariants such as the Book constraint
bc..
invariant SufficientCopies:
library.loans->select((book = self))->size() <= copies;
p.
This invariant is named SufficientCopies. It
* navigates from the implicit self (a Book)
* via the library
* to its loans which it searches
* to select those loans that satisfy the predicate
** loaned book is equal to the self Book
* the size (number) of loans is computed
* and compared to the number of copies of the self Book
The invariant is satisfied if it evaluates true; i.e. if the number of loans is less than or equal to the number of copies.
You can see this invariant at work, by selecting *model/Tutorial.xmi* and using the right button to invoke *Open With->Sample Reflective Ecore Model Editor*. This gives you a tree view of a small library model.
Expand the root element and then select the *Library lib* element and use the right button menu to invoke *Validate*. You should get a pop-up reporting problems during Validation. Click *Details* and you will see that one of the problems is with the *SufficientCopies* invariant we have just looked at. If you browse the Properties View for *model/Tutorial.xmi*, you can verify that there are three loans but only two copies for the offending Book.
You may evaluate custom OCL queries interactively. From the editor for *Tutorial.xmi*, invoke *OCL->Show Xtext OCL Console* from the context menu. Select *Book b2* in the editor, then in the bottom line of the console enter the OCL expression *loans.member* and then Enter. The results are shown in the panel and identify that all three loans are by *Member m3*.
The expression *loans.member* is an abbreviated form of *self.loans->collect(aLoan : Loan | aLoan.member)* and demonstrates OCL's ability to perform many useful navigations over multi-element properties. The expression
* navigates from self, the Book b2 selection
* to its loans, using Book::loans which is a derived property defined in OCL
* for each of the loans, the iterator variable, aLoan, is assigned to the loan and
** the body, aLoan.member is evaluated to return the member making the loan
* the resulting members are collected to return a collection result
* the result is displayed on three lines in the results panel
You can step through execution using the OCL debugger. In the Console View type PageUp to restore the earlier text entry, then with *Book b2* still selected in the editor, click the debug icon in the Console tool bar. The debugger should open automatically, but if it doesn't, use *Window->Show View->Debug* from the Eclipse menu bar. The Variables View shows model elemnt values. Click F5 or Step Into a few times to progress execution.
You have now seen
* an Xtext editor that embeds OCL directly in Ecore models to provide programmed enrichment
* execution of OCL while validating a model using conventional Ecore tooling
* an interactive Console for custom OCL evaluations
* execution of a derived property defined in OCL
* the ability of OCL to express operations on multi-elements compactly
* the ability to debug OCL execution and browse data
You have not
* written any Java code
* generated any plugins
* needed to start an additional Eclipse session
Please follow the tutorials, examples and reference material for further information.