| h2(#Persistence). OCL Persistence |
| |
| The Eclipse OCL component implements the OCL Abstract Syntax model as an EMF-based metamodel. |
| Thus, parsed OCL expressions and constraints can be serialized, for example in XMI documents. |
| The OCL 2.3 specification is unclear about how the serialization of expressions should look (this will be solved in the next OCL 2.4 specification), |
| especially where references to demand-created types are concerned. This topic discusses the |
| approach taken by the Eclipse OCL component to provide a practical solution to this problem. |
| |
| h3. The Type Resolver |
| |
| OCL defines a number of template metaclasses, including the @CollectionType@ |
| metaclass and its specializations, @MessageType@, and |
| @TupleType@. In all of these cases, OCL specifies that these |
| templates are instantiated as needed in the OCL environment, and that only one instance |
| of a template exists for any given combination of template arguments. For example, only one |
| @OrderedSet(String)@ exists and it is created on the occasion when |
| it is first needed. Likewise, the @OclMessage@ type for invocations |
| of the @EModelElement::getEAnnotation(EString)@ operation and the |
| @Tuple{a : String, b : EClass}@ type. |
| |
| The problem is, that the OCL Specification does not indicate how expressions that reference |
| such demand-created types can be persisted, because it does not define what should own these |
| types. A similar problem exists for additional operations and attributes defined in OCL |
| via @def:@ expressions. The |
| "@TypeResolver@":http://download.eclipse.org/modeling/mdt/ocl/javadoc/3.1.0/org/eclipse/ocl/TypeResolver.html API is responsible for the demand-creation of these types and for their persistence. |
| |
| !images/5170-persistence.png(OCL Persistence API)! |
| |
| Every "@Environment@":http://download.eclipse.org/modeling/mdt/ocl/javadoc/3.1.0/org/eclipse/ocl/Environment.html has a @TypeResolver@ that persists demand-created types and additional features. For a client that doesn't require persistence, the @TypeResolver@ will create a @Resource@ with the dummy @ocl://@ scheme (no resource factory is provided for this scheme). |
| |
| A client that does require persistence of OCL expressions and these demand-created elements |
| should provide a specific resource in which to store them, either via the |
| "@OCL@":http://download.eclipse.org/modeling/mdt/ocl/javadoc/3.1.0/org/eclipse/ocl/OCL.html class's |
| @newInstance(EnvironmentFactory, Resource)@ factory method or via |
| the "@EnvironmentFactory@":http://download.eclipse.org/modeling/mdt/ocl/javadoc/3.1.0/org/eclipse/ocl/EnvironmentFactory.html interface's @load(Resource)@ method. |
| |
| bc.. |
| Resource modelResource = getResourceSet().getResource( |
| URI.createPlatformResourceURI("/models/My.ecore", true), true); |
| |
| // persist demand-created types etc. in my model resource |
| OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl; |
| ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE, myResource); |
| |
| // use the OCL to parse constraints, store them in the Ecore model, and save everything |
| // together in one resource for a consistent, self-contained OCL environment |
| |
| ... |
| p. |
| |
| The "@AbstractTypeResolver@":http://download.eclipse.org/modeling/mdt/ocl/javadoc/3.1.0/org/eclipse/ocl/AbstractTypeResolver.html class creates packages in which to store the different elements that it creates: collection types, message types, tuple types, and additional operations and attributes. These last are owned by classes that "shadow" the classifiers in which context they are defined, in |
| the manner by which the OCL specification's adaptation for EMOF indicates that operations |
| are to be "owned" by EMOF @DataType@ s. |
| |
| An environment implementation can customize the way these demand-created elements are |
| stored, by choosing different packages or using some other strategy altogether. Or, using |
| the default @TypeResolver@ implementation, a client of the OCL |
| parser can find the demand-created objects in the resolver's resource and relocate them |
| as needed. |
| |