Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "OCL/OCLinEcore"

< OCL
(OCL in Ecore Editor)
Line 131: Line 131:
 
==OCL in Ecore Editor==
 
==OCL in Ecore Editor==
  
The Sample Ecore Editor is convenient for maintaining a couple of OCL constraints, but it has distinct limitations as an OCL environment
+
The Sample Ecore Editor is convenient for maintaining a couple of OCL constraints, but it has distinct limitations as an Integrated OCL Development Environment:
* maintenance of the EAnnotations needs care
+
* maintenance of the EAnnotations needs care.
* the OCL expression is difficult to read in the Properties View
+
* the OCL expression is difficult to read in the Properties View.
* syntactic and semantic errors in the OCL are not detected
+
* syntactic and semantic errors in the OCL are not detected.
  
 
The OCL in Ecore Editor overcomes these limitations. The Editor will be available for use with MDT/OCL 3.0.0 by activating the MDT/OCL 3.0.0 Examples functionality. <Description to be provided.>
 
The OCL in Ecore Editor overcomes these limitations. The Editor will be available for use with MDT/OCL 3.0.0 by activating the MDT/OCL 3.0.0 Examples functionality. <Description to be provided.>
  
With the OCL in Ecore Editor installed, you may select the Ecore file in a Navigator or Explorer and invoke Open With->OCL in Ecore Editor from the context dependent right button menu. The display should show (with syntax coloring)
+
With the OCL in Ecore Editor installed, you may select the Ecore file in a Navigator (Resource Explorer, Package Explorer,...) and invoke Open With->OCL in Ecore Editor from the context dependent right button menu. The display should show (with syntax coloring)
  
 
<pre>
 
<pre>

Revision as of 13:09, 3 March 2010

This page describes functionality available when EMF 2.6.0M4 or later and MDT/OCL 3.0.0M6 or later are installed within Eclipse.

Ecore Representation

The OCL in Ecore annotations can be maintained directly using the Sample Ecore Editor. An example is shown below.

Example OCL in Ecore Annotations

The relevant annotations (a purple dumbbell with a paperclip) may be added by selecting New Child->EAnnotation and then New Child->Details Entry.

EPackage configuration

The embedded OCL becomes active when the appropriate delegate functionality is specified. In practice all three functionalities should be specified. This specification provides EMF with the required configuration information to access the extended functionality provided by these delegates.

Setting Delegate

The setting delegate functionality enables OCL expressions to define initial or derived value of an EStructuralFeature. Thus when eGet(CompanyPackage.Literals.COMPANY__SIZE) or Company.getSize() is invoked the OCL expression is evaluated to provide the value. In an OCL context, the corresponding eSet or setSize is not applicable.

The setting delegate is specified by an EPackage EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore"
Key = "settingDelegates"
Value = "http://www.eclipse.org/emf/2002/Ecore/OCL"

The delegate value matches an org.eclipse.emf.ecore.setting_delegate extension point usage in the org.eclipse.ocl.ecore plug-in that provides the delegate functionality. Multiple comma-separated delegates may be specified.

Invocation Delegate

The invocation delegate functionality enables OCL expressions to define the body of an EOperation. Thus when eInvoke(CompanyPackage.Literals.EMPLOYEE__REPORTS_TO) or Employee.reportsTo() is invoked the OCL expression is evaluated to provide the value.

The invocation delegate is specified by an EPackage EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore"
Key = "invocationDelegates"
Value = "http://www.eclipse.org/emf/2002/Ecore/OCL"

The delegate value matches an org.eclipse.emf.ecore.invocation_delegate extension point usage in the org.eclipse.ocl.ecore plug-in that provides the delegate functionality. Multiple comma-separated delegates may be specified.

Validation Delegate

The validation delegate functionality enables OCL expressions to define one or more invariants of an EClassifier. Thus when the EValidator is activated to validate the classifier, the OCL expressions are evaluated.

The validation delegate is specified by an EPackage EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore"
Key = "validationDelegates"
Value = "http://www.eclipse.org/emf/2002/Ecore/OCL"

The delegate value matches an org.eclipse.emf.ecore.validation_delegate extension point usage in the org.eclipse.ocl.ecore plug-in that provides the delegate functionality. Multiple comma-separated delegates may be specified.

EClassifier invariants

EMF provides two different mechanisms for refining EClassifier behavior.

An Ecore-constraint comprises one EAnnotation per named OCL-invariant constraint and an EAnnotation to enumerate the invariant names.

An Ecore-invariant comprises one stylized EOperation per OCL-invariant constraint, with an EAnnotation to define the operation body.

For OCL usage the Ecore-constraint should be preferred.

Ecore-constraint

The example shows the specification of the body for the Employee mustHaveName invariant equivalent to the following OCL Document snippet.

context Employee
inv mustHaveName:
not name.oclIsUndefined()

The body is specified by an EClassifier EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore/OCL"
Key = "mustHaveName"
Value = ...the OCL expression...

and an EClassifier EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore"
Key = "constraints"
Value = space-separated list of invariant names

Ecore-invariant

The example partially shows the specification of the body for the Employee noManagerImpliesDirectReports invariant equivalent to the following OCL Document snippet.

context Employee
inv noManagerImpliesDirectReports:
manager.oclIsUndefined() implies directReports->size() > 0

There is no need for any EClassifier EAnnotation. The invariant body should be specified as an EOperation body.

The EOperation must have an EBoolean return, and two parameters of type EDiagnosticChain and EMap<EjavaObject, EJavaObject>. This signature is not representable as an OCL operation and so the semantically equivalent Ecore-constraint is preferred.

EStructuralFeature initial and derived values

The example shows the specification of a derived value for the Company::size EStructuralFeature equivalent to the following OCL Document snippet.

context Company::size : CompanySizeKind
derive:
let table : Set(Tuple(range : Sequence(Integer), size : CompanySizeKind)) =
    Set{
	Tuple{range=Sequence{0..49}, size=CompanySizeKind::small},
        Tuple{range=Sequence{50..999}, size=CompanySizeKind::medium},
        Tuple{range=Sequence{1000..1000000}, size=CompanySizeKind::large}}
    in table->any(range->includes(employees->size())).size

The derived value is specified by an EStructuralFeature EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore/OCL"
Key = "derivation"
Value = ...the OCL expression...

An initial value may be similarly specified with:
Source = "http://www.eclipse.org/emf/2002/Ecore/OCL"
Key = "initial"
Value = ...the OCL expression...

EOperation bodies, preconditions and postconditions

The example shows the specification of the body for the Employee::reportsTo(Employee) EOperation equivalent to the following OCL Document snippet.

context Employee::reportsTo(manager : Employee) : Boolean
body:self.reportingChain->includes(manager)

The body is specified by an EOperation EAnnotation with:
Source = "http://www.eclipse.org/emf/2002/Ecore/OCL"
Key = "body"
Value = ...the OCL expression...

A precondition or postcondition may be similarly specified using "precondition" or "postcondition" as the Key.

Note that preconditions and postconditions are ignored by MDT/OCL 3.0.0.

OCL in Ecore Editor

The Sample Ecore Editor is convenient for maintaining a couple of OCL constraints, but it has distinct limitations as an Integrated OCL Development Environment:

  • maintenance of the EAnnotations needs care.
  • the OCL expression is difficult to read in the Properties View.
  • syntactic and semantic errors in the OCL are not detected.

The OCL in Ecore Editor overcomes these limitations. The Editor will be available for use with MDT/OCL 3.0.0 by activating the MDT/OCL 3.0.0 Examples functionality. <Description to be provided.>

With the OCL in Ecore Editor installed, you may select the Ecore file in a Navigator (Resource Explorer, Package Explorer,...) and invoke Open With->OCL in Ecore Editor from the context dependent right button menu. The display should show (with syntax coloring)

package company

context Company::size : CompanySizeKind
derive:
let table : Set(Tuple(range : Sequence(Integer), size : CompanySizeKind)) =
    Set{
	Tuple{range=Sequence{0..49}, size=CompanySizeKind::small},
        Tuple{range=Sequence{50..999}, size=CompanySizeKind::medium},
        Tuple{range=Sequence{1000..1000000}, size=CompanySizeKind::large}}
    in table->any(range->includes(employees->size())).size

context Employee
inv mustHaveName:
not name.oclIsUndefined()

context Employee
inv noManagerImpliesDirectReports:
manager.oclIsUndefined() implies directReports->size() > 0

context Employee::directReports : OrderedSet(Employee)
derive:company.employees->select(manager = self)

context Employee::allReports : Set(Employee)
derive:Employee.allInstances()->select(reportsTo(self))

context Employee::reportingChain : OrderedSet(Employee)
derive:if (manager.oclIsUndefined()) then OrderedSet{}
else manager.reportingChain->prepend(manager)
endif 

context Employee::reportsTo(manager : Employee) : Boolean
body:self.reportingChain->includes(manager)

endpackage

This OCL Document may be edited with the aid of syntax and semantic validation and completion suggestions.

When the OCL Document is saved, the Ecore model EAnnotations are updated with the changed OCL. Whitespace and OCL comments within and surrounding the OCL expressions are persisted.

Back to the top