| |
| h2(#PivotEvaluatingConstraints). Evaluating Constraints and Queries |
| |
| In "Parsing Constraints":#PivotParsingConstraints, we saw how to use |
| the @OCL@ Facade to parse a textual OCL constraint or query expressions to give its |
| @ExpressionInOCL@ compiled representation. Parsing constraints is interesting, |
| but evaluating them using the |
| "@Query@":http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/Query.html |
| API is much more useful. |
| |
| h3. The OCL Query |
| |
| The |
| "@Query@":http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/Query.html |
| class wraps the minimal @ExpressionInOCL@ parse result to provide evaluation capabilities. |
| |
| !{width:60%}images/6315-query.png(OCL Query API)! |
| |
| The @Query@ encapsulates an |
| "@EvaluationEnvironment@":http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/evaluation/EvaluationEnvironment.html |
| providing the run-time values of context variables to the OCL interpreter. These |
| context variables are set and retrieved using the following methods: |
| |
| * @add(TypedElement, Object)@: adds a TypedElement-to-value binding |
| * @replace(TypedElement, Object)@: replaces an existing binding |
| * @remove(TypedElement)@: removes a binding |
| * @getValueOf(TypedElement)@: obtains a binding value |
| |
| .bq |
| The Ecore/UML binding of Eclipse OCL used String rather than TypedElement to support name-to-value bindings. |
| The use of TypedElement rather than String avoids whereby the same name refers to multiple Variables depending on context. |
| .p |
| |
| The context variables of primary interest are @self@ |
| and, in operation constraints, the variables corresponding to its parameters. |
| |
| An important consideration for OCL evaluation is the |
| @allInstances()@ operation, which obtains the entire |
| extent of a classifier. For data types, this is a simple problem: the extent |
| of an @Enumeration@ is well defined and the extents of |
| other kinds of @DataType@==s== are undefined. For |
| @Class@ extents, the @OCL@ handle references a "@ModelManager@":http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/evaluation/ModelManager.html |
| that provides access to the user's models. The default |
| "@PivotModelManager@":http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/internal/evaluation/PivotModelManager.html |
| lazily computes the extent of a class from the EMF @ResourceSet@ |
| containing the context element of the evaluation. |
| |
| So, after optionally setting values of context variables (other than |
| @self@; the @Query@ takes care |
| of this) and an extent map, simply construct a query and use it to evaluate |
| the expression or check the constraint: |
| |
| !{width:70%}images/6315-check-all.png(Evaluating all Constraints)! |
| "[Text for cut and paste]":../references/6315-check-all.txt |
| |
| h3. Object representations |
| |
| The example above uses @evaluateUnboxed()@ so that the return value is unboxed and so compatible with the Classic Ecore/UML OCL binding. |
| |
| The Pivot binding of OCL supports three distinct Java representations. |
| |
| * boxed for internal use |
| * unboxed for traditional API compatibility |
| * Ecore for Ecore API compatibility |
| |
| table{border:1px solid black}. |
| |_.OCL|_.Unboxed|_.Ecore|_.Boxed| |
| |Boolean|Boolean|Boolean|Boolean| |
| |String|String|String|String| |
| |Integer|Integer/Long/BigDecimal|Integer/Long/BigDecimal|IntegerValue| |
| |Real|Float/Double|Float/Double|RealValue| |
| |Object|EObject|EObject|EObject| |
| |Type|EClassifier|EClassifier|TypeValue| |
| |null|null|null|null| |
| |invalid|InvalidValueException|InvalidValueException|InvalidValueException| |
| |Collection|Collection|EList|CollectionValue| |
| |Bag|Bag|EList|BagValue| |
| |Sequence|List|EList|SequenceValue| |
| |OrderedSet|OrderedSet|EList|OrderedSetValue| |
| |Set|Set|EList|SetValue| |
| |
| The boxed representation is used wherever the Java semantics of @Object.equals(Object)@ is different |
| to the OCL semantics of @OclAny::_'='(OclAny)@. |
| |
| The unboxed representation is used when a similar representation to the Ecore/UML binding is required. |
| |
| The Ecore representation is used for all interchange with Ecore EStructuralFeature values or EOperation |
| arguments and returns. |
| |
| |
| |
| h3. Multiple Evaluations |
| |
| One of the advantages of the @Query@ API is that a |
| query's evaluation environment can be reused for multiple evaluations, as |
| above. The extent of any classifier is only computed once. For convenience, |
| however, in situations where only a single evaluation is required, the |
| @OCL@ class provides shortcuts: |
| |
| !{width:70%}images/6315-check-one.png(Evaluating one Constraint)! |
| "[Text for cut and paste]":../references/6315-check-one.txt |
| |
| h3. Succint Evaluations |
| |
| The @Query@ API also provides methods that work on |
| multiple elements. The first example, above, could be written more succinctly as: |
| |
| !{width:70%}images/6315-check-quick.png(Evaluating Constraints Quicker)! |
| "[Text for cut and paste]":../references/6315-check-quick.txt |