| <html> | |
| <head> | |
| <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
| <title>OCL Persistence</title> | |
| <link href="book.css" rel="stylesheet" type="text/css"> | |
| <meta content="DocBook XSL Stylesheets V1.75.1" name="generator"> | |
| <link rel="home" href="index.html" title="OCL Documentation"> | |
| <link rel="up" href="ProgrammersGuide.html" title="Classic Ecore/UML Programmers Guide"> | |
| <link rel="prev" href="CustomizingtheEnvironment.html" title="Customizing the Environment"> | |
| <link rel="next" href="AdvancedMetamodelBindings.html" title="Creating Metamodel Bindings"> | |
| </head> | |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> | |
| <h1 xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">OCL Persistence</h1> | |
| <div class="section" title="OCL Persistence"> | |
| <div class="titlepage"> | |
| <div> | |
| <div> | |
| <h2 class="title" style="clear: both"> | |
| <a name="Persistence"></a>OCL Persistence</h2> | |
| </div> | |
| </div> | |
| </div> | |
| <p>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.4 specification is unclear about how the serialization of expressions should look (this will be solved in the next OCL 2.5 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.</p> | |
| <div class="section" title="The Type Resolver"> | |
| <div class="titlepage"> | |
| <div> | |
| <div> | |
| <h3 class="title"> | |
| <a name="TheTypeResolver"></a>The Type Resolver</h3> | |
| </div> | |
| </div> | |
| </div> | |
| <p>OCL defines a number of template metaclasses, including the | |
| <code class="code">CollectionType</code> | |
| metaclass and its specializations, | |
| <code class="code">MessageType</code>, and | |
| <code class="code">TupleType</code>. 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 | |
| <code class="code">OrderedSet(String)</code> exists and it is created on the occasion when | |
| it is first needed. Likewise, the | |
| <code class="code">OclMessage</code> type for invocations | |
| of the | |
| <code class="code">EModelElement::getEAnnotation(EString)</code> operation and the | |
| <code class="code">Tuple{a : String, b : EClass}</code> type. | |
| </p> | |
| <p>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 | |
| <code class="code">def:</code> expressions. The | |
| <a class="ulink" href="http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/TypeResolver.html" target="_new"> | |
| <code class="code">TypeResolver</code> | |
| </a> API is responsible for the demand-creation of these types and for their persistence. | |
| </p> | |
| <p> | |
| </p> | |
| <div class="mediaobject"> | |
| <img src="images/5170-persistence.png"></div> | |
| <p> | |
| </p> | |
| <p>Every | |
| <a class="ulink" href="http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Environment.html" target="_new"> | |
| <code class="code">Environment</code> | |
| </a> has a | |
| <code class="code">TypeResolver</code> that persists demand-created types and additional features. For a client that doesn’t require persistence, the | |
| <code class="code">TypeResolver</code> will create a | |
| <code class="code">Resource</code> with the dummy | |
| <code class="code">ocl://</code> scheme (no resource factory is provided for this scheme). | |
| </p> | |
| <p>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 | |
| <a class="ulink" href="http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html" target="_new"> | |
| <code class="code">OCL</code> | |
| </a> class’s | |
| <code class="code">newInstance(EnvironmentFactory, Resource)</code> factory method or via | |
| the | |
| <a class="ulink" href="http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/EnvironmentFactory.html" target="_new"> | |
| <code class="code">EnvironmentFactory</code> | |
| </a> interface’s | |
| <code class="code">load(Resource)</code> method. | |
| </p> | |
| <div class="literallayout"> | |
| <p> | |
| <code class="code">Resource modelResource = getResourceSet().getResource(<br> | |
| URI.createPlatformResourceURI("/models/My.ecore", true), true);<br> | |
| <br> | |
| // persist demand-created types etc. in my model resource<br> | |
| OCL<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl;<br> | |
| ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE, myResource);<br> | |
| <br> | |
| // use the OCL to parse constraints, store them in the Ecore model,<br> | |
| // and save everything together in one resource for a consistent,<br> | |
| // self-contained OCL environment<br> | |
| <br> | |
| ...<br> | |
| </code> | |
| </p> | |
| </div> | |
| <p></p> | |
| <p>The | |
| <a class="ulink" href="http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/AbstractTypeResolver.html" target="_new"> | |
| <code class="code">AbstractTypeResolver</code> | |
| </a> 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 | |
| <code class="code">DataType</code> s. | |
| </p> | |
| <p>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 | |
| <code class="code">TypeResolver</code> implementation, a client of the OCL | |
| parser can find the demand-created objects in the resolver’s resource and relocate them | |
| as needed. | |
| </p> | |
| </div> | |
| </div> | |
| </body> | |
| </html> |