| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <title>Emfatic</title> |
| <meta name="description" content=""> |
| <meta name="author" content=""> |
| |
| <!-- Le styles --> |
| <link href="css/bootstrap.css" rel="stylesheet"> |
| <style type="text/css"> |
| body { |
| padding-top: 60px; |
| } |
| body { |
| text-align:justify; |
| } |
| </style> |
| <link href="css/bootstrap-responsive.css" rel="stylesheet"> |
| |
| <!-- Le fav and touch icons --> |
| <link rel="shortcut icon" href="images/favicon.ico"> |
| <link rel="apple-touch-icon" href="images/apple-touch-icon.png"> |
| <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png"> |
| <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png"> |
| </head> |
| |
| <body> |
| |
| <div class="navbar navbar-fixed-top"> |
| <div class="navbar-inner"> |
| <div class="container"> |
| <a class="brand" href="http://www.eclipse.org/">Eclipse.org</a> |
| <ul class="nav"> |
| <li><a href="http://www.eclipse.org/">Home</a></li> |
| <li><a href="http://www.eclipse.org/downloads">Downloads</a></li> |
| <li><a href="http://www.eclipse.org/users/">Users</a></li> |
| <li><a href="http://www.eclipse.org/membership/">Members</a></li> |
| <li><a href="http://www.eclipse.org/committers/">Committers</a></li> |
| <li><a href="http://www.eclipse.org/resources/">Resources</a></li> |
| <li><a href="http://www.eclipse.org/projects/">Projects</a></li> |
| <li><a href="http://www.eclipse.org/org/">About us</a></li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| |
| <div |
| class="container"> |
| |
| <ul class="breadcrumb"> |
| <li> |
| <a href="http://www.eclipse.org">Eclipse.org</a> <span class="divider">/</span> |
| </li> |
| <li> |
| <a href="http://www.eclipse.org/modeling">Eclipse Modeling Project</a> <span class="divider">/</span> |
| </li> |
| <li> |
| <a href="http://www.eclipse.org/modeling/emft">Eclipse Modeling Framework Technology (EMFT)</a> <span class="divider">/</span> |
| </li> |
| <li class="active"> |
| <a href="#">Emfatic</a> |
| </li> |
| </ul> |
| |
| <div class="hero-unit"> |
| <h1>Emfatic</h1> |
| <p>A language designed to represent <a href="http://www.eclipse.org/emf">EMF Ecore</a> models in a textual form.</p> |
| </div> |
| |
| <div class="row"> |
| <div class="span8"> |
| |
| <h2>Language reference</h2> |
| This article details the syntax of Emfatic and the |
| mapping between Emfatic declarations and the corresponding Ecore |
| constructs.<br><br> |
| |
| <b>Disclaimer:</b> This document was originally written by Chris Daly (cjdaly@us.ibm.com) |
| (Copyright IBM Corp. 2004) <a href="#about"> (read more...)</a> |
| <br><br> |
| |
| <h3>1. Packages</h3> |
| In this article, Emfatic programs are shown in boxes |
| as in the example below:<br> |
| <br> |
| <pre>package test; |
| class Foo { }</pre> |
| <br> |
| When compiled, the program above will produce a model with an <code>EPackage</code> named "test" containing a |
| single <code>EClass</code> named "Foo".<br> |
| <br> |
| As is probably clear from the first Emfatic program above, the keyword <span>package</span> introduces an Ecore <code>EPackage</code> and the identifier |
| following it maps to the <code>name</code> |
| attribute of the generated <code>EPackage</code>.<br><br> |
| |
| <h4>1.1 Main Package</h4> |
| The only thing required in an Emfatic source file is a package |
| declaration. This required element is called the main package |
| declaration and the <code>EPackage</code> |
| it defines will contain (directly or indirectly) all of the other |
| elements of the generated Ecore model. Thus the simplest possible |
| Emfatic program would look something like this:<br> |
| <br> |
| </div> |
| <div class="span4"> |
| <h3>Update site</h3> |
| <div class="alert alert-info"><b>http://download.eclipse.org/emfatic/update</b></div> |
| <div class="alert alert-warning"><b>Warning:</b> If you've installed a previous version of Emfatic from a different update site you'll need to uninstall it before installing this one.</div> |
| |
| </div> |
| |
| <div class="span4"> |
| <h3>Links</h3> |
| <ul class="nav nav-pills nav-stacked"> |
| <li class="active"><a href="#">Home</a> |
| <li><a href="http://www.eclipse.org/forums/index.php/f/19/">Forum</a> |
| <li><a href="http://wiki.eclipse.org/Emfatic">Wiki Article and Screenshots</a> |
| <li><a href="http://www.emn.fr/z-info/atlanmod/index.php/Emfatic">A Large Collection of Emfatic Models</a> |
| </ul> |
| </div> |
| <div class="span4"> |
| <h3>Source code</h3> |
| |
| <ul> |
| <li><b>Server:</b> cvs.eclipse.org |
| <li><b>Repository:</b> /cvsroot/modeling |
| <li><b>Module:</b> org.eclipse.emf/org.eclipse.emf.emfatic |
| </ul> |
| |
| </div> |
| <div class="span12"> |
| <pre>package p;</pre> |
| Specifying values for the <code>EPackage</code> |
| attributes <code>nsURI</code> and <code>nsPrefix</code> is done like this:<br> |
| <br> |
| <pre>@namespace(uri="http://www.eclipse.org/emf/2002/Ecore", prefix="ecore") |
| package ecore;</pre> |
| Note that Emfatic is case-sensitive in most contexts (reflecting the |
| underlying case-sensitivity of Ecore), however the identifiers <span>namespace</span>, <span>uri</span> and <span>prefix</span> in the text above could |
| be written in |
| any case. Also note that the order of declaration for <span>uri</span> and <span>prefix</span> is not important<span></span>. The syntax of the <span>@namespace</span> declaration is |
| actually a special case of the more general syntax for declaring |
| EAnnotations, which will be described in full detail in section 5 below.<br> |
| <br> |
| <h4>1.2 Sub-Packages</h4> |
| Ecore allows packages to be nested inside packages. In Emfatic, |
| the syntax for nested packages differs from that of the main |
| package. Nested package declarations are followed by a |
| curly-brace bracketed region which encloses the nested package |
| contents. The example below demonstrates package nesting.<br/> |
| |
| <pre>package main; |
| |
| package sub1 { |
| } |
| |
| package sub2 { |
| package sub2_1 { } |
| package sub2_2 { } |
| }</pre> |
| In the Ecore model generated from the above program, the top-level |
| package named "main" will contain two packages, "sub1" and "sub2", and |
| package sub2 will contain the packages "sub2_1" and "sub2_2".<br> |
| <br> |
| <h4>1.3 Main Package Imports</h4> |
| Import statements allow for types defined in external Ecore models to |
| be referenced. All import statements must immediately follow the |
| main package declaration. The example below demonstrates the |
| basic syntax of import statements. The double-quoted string |
| literal following the import keyword must contain the URI of an Ecore |
| model.<br> |
| <br> |
| <pre>package main; |
| import "platform:/resource/proj1/foo.ecore"; |
| import "http://www.eclipse.org/emf/2002/Ecore"; |
| |
| package sub { }</pre> |
| Note that Ecore.ecore is automatically imported, so the second import |
| in the program above is not really necessary.<br> |
| <br> |
| <h3>2. Classifiers</h3> |
| <h4>2.1 Classes</h4> |
| The Emfatic syntax for class declarations is very similar to Java, |
| however a few quirks are required to allow for all of the possibilities |
| of Ecore. The example below containing four simple class |
| declarations demonstrates the use of the keywords <code>class</code>, <code>interface</code> and <code>abstract</code> and also introduces Emfatic comments (Emfatic allows both styles of Java comments). |
| The comments detail the mapping from Emfatic to the <code>EClass</code> attributes <code>interface</code> and <code>abstract</code>.<br> |
| <br> |
| <pre>package main; |
| class C1 { |
| } |
| // isInterface=false, isAbstract=false<br> |
| abstract class C2 { } // isInterface=false, isAbstract=true |
| interface I1 { } // isInterface=true, isAbstract=false |
| abstract interface I2 { } // isInterface=true, isAbstract=true |
| </pre> |
| Inheritance is specified with the keyword <code>extends</code>. Unlike Java, |
| there is no <code>implements</code> |
| keyword to distinguish inheritance from interface implementation. |
| The example below defines an inheritance hierarchy.<br> |
| <br> |
| <pre>package main; |
| class A { } |
| class B { } |
| class C extends A, B { } |
| class D extends C { } |
| </pre> |
| If necessary, the value of the <code>EClassifier</code> |
| attribute <code>instanceClassName</code> |
| can be specified. The class <code>EStringToStringMapEntry</code> |
| from Ecore.ecore provides an example of this:<br><br> |
| <pre>class EStringToStringMapEntry : java.util.Map$Entry { |
| // ... contents omitted ... |
| }</pre> |
| <br> |
| Note that if the class both extends other classes and specifies a value |
| for <span style="font-weight: bold;">instanceClassName</span>, the <span>extends</span> clause must precede the |
| <span style="font-weight: bold;">instanceClassName</span> clause.<br> |
| <br> |
| <h4>2.2 Data Types</h4> |
| Declaring an <code>EDataType</code> is fairly simple. Here are some familiar |
| examples from Ecore.ecore:<br> |
| <br> |
| <pre>datatype EInt : int; |
| datatype EIntegerObject : java.lang.Integer; |
| transient datatype EJavaObject : java.lang.Object; |
| |
| datatype EFeatureMapEntry : org.eclipse.emf.ecore.util.FeatureMap$Entry; |
| datatype EByteArray : "byte[]"; // Note: [ and ] are not legal |
| identifier characters and must be in quotes</pre> |
| <br> |
| First note that as with classes, the value of the <code>EClassifier</code> attribute <code>instanceClassName</code> follows the colon |
| after the name of the datatype. However specifying <code>instanceClassName</code> is required for |
| datatypes (while it is optional for classes).<br> |
| <br> |
| The keyword <code>transient</code> in |
| the third datatype declaration above indicates that the value of the <code>EDataType</code> <code>serializable</code> attribute should be set |
| to false. This is a good time to point out that the modifier |
| keywords introduced so far (<code>abstract</code> |
| and <code>interface</code>) are |
| applied to reverse the default Ecore attribute values (by default <code>EClass</code> attributes <code>abstract</code> and <code>interface</code> are both false). In |
| the case of the <code>EDataType</code> |
| attribute <code>serializable</code>, the |
| default value is true so Emfatic uses a keyword, <code>transient</code>, that means the |
| opposite of serializable.<br> |
| <br> |
| The last two datatypes illustrate a subtle syntactic point. The |
| value specified for the <code>instanceClassName</code> |
| attribute must either be a valid qualified identifier (a dot or |
| dollar-sign separated list of identifiers such as <code>java.lang.Object</code> in the third |
| datatype above) or it must be enclosed in double quotes. The |
| datatype EFeatureMapEntry contains the character '<code>$</code>' which, following Java |
| syntactic rules, is a legal qualified identifier separator. The |
| datatype EByteArray contains the characters '<code>[</code>' and '<code>]</code>' which are not legal in a |
| qualified identifier.<br> |
| <br> |
| The overall point to make about qualified identifier versus |
| double-quoted syntax for <code>instanceClassName</code> |
| is that the typical datatype declaration can use the former and thus |
| should be easier to read and edit, while the latter is available when |
| needed and allows for arbitrary string text to be placed in the |
| generated Ecore model. There are some other contexts where the |
| Emfatic programmer has the option to use either a qualified identifier |
| or double-quoted string (see the section on Annotations below for |
| another example of this).<br> |
| <br> |
| <h4>2.3 Enumerated Types</h4> |
| The example below demonstrates the Emfatic syntax that maps to <code>EEnum</code> and <code>EEnumLiteral</code>. Note that the |
| simple assignment expressions specify the <code>value</code> attribute of each generated <code>EEnumLiteral</code>.<br> |
| <br> |
| <pre>enum E { |
| A=1; |
| B=2; |
| C=3; |
| }</pre> |
| |
| <br> |
| In fact, specifying enumeration literal values is optional and |
| Emfatic generates reasonable values when they are left |
| unspecified. The code and comments below describe the rules for |
| this.<br> |
| <br> |
| <pre>enum E { |
| A; // = 0 (if not specified, first literal has value 0)<br> |
| B = 3; |
| C; // = 4 (in general, unspecified values are 1 greater than previous value) |
| D; // = 5 |
| }</pre> |
| <br> |
| <h4>2.4 Map Entries</h4> |
| MapEntry classes (such as <code>EStringToStringMapEntry</code> |
| in Ecore.ecore) can be specified in either of two ways. The |
| "longhand" way is to declare a class with features named <code>key</code> and <code>value</code> and with <code>[instanceClass=java.util.Map$Entry]</code> |
| as suggested at the end of section 2.1 above. But there is a |
| convienent shorthand notation which achieves the same result:<br><br> |
| <pre>mapentry EStringToStringMapEntry : String -> String;</pre> |
| <br> |
| The expression following the colon gives the type of the MapEntry <code>key</code> structural feature followed by |
| the <code>-></code> |
| operator, followed by the type of the <code>value</code> |
| structural feature. Type expressions can |
| be more complex than shown in the example above and are detailed fully |
| in the next section.<br> |
| <br> |
| <h3>3. Type Expressions<br> |
| </h3> |
| The most basic Ecore elements that haven't yet been explored in Emfatic |
| are the structural and behavioral class features represented by the |
| Ecore classes <code>EAttribute</code>, |
| <code>EReference</code>, <code>EOperation</code> and <code>EParameter</code>. These four Ecore |
| classes are all derived from <code>ETypedElement</code> |
| which means that instances of them have some type (which is an <code>EClassifier</code>) and inherit the other |
| characteristics of <code>ETypedElement</code>, |
| like multiplicity. Before we can describe each specific kind of |
| class feature, we need to show |
| how types are represented syntactically, because that applies (more or |
| less) to all of them.<br> |
| <br> |
| Type expressions have two parts. First is a simple identifier or |
| a qualified identifier (a dot-separated list of simple identifiers like |
| "a.b.c") that identifies some <code>EClassifier</code>. |
| The <code>EClassifier</code> |
| identified may be defined in the same Emfatic source file as the type |
| expression, or it may be in one of the imported Ecore models (specified |
| in import statements).<br> |
| <br> |
| Let's skip ahead a little by looking at some attribute declarations so |
| that we can talk about their type expressions:<br> |
| <br> |
| <pre>package test; |
| |
| datatype D1 : int;<br> |
| package P { |
| datatype D2 : int; |
| } |
| |
| class C { |
| attr D1 d1; |
| attr P.D2 d2; |
| attr ecore.EString s1; |
| attr String s2; |
| }</pre> |
| <br> |
| The class named "C" above declares four attributes with the names "d1", |
| "d2", "s1" and "s2". Note that Emfatic follows Java syntactic |
| style in placing type expression before the name. However unlike |
| Java field declarations, Emfatic uses a keyword - <code>attr</code> - to introduce an |
| attribute. (The keyword <code>attr</code> |
| and similar keywords to introduce references and operations will |
| explained in more detail in the following sub-sections).<br> |
| <br> |
| The type expression for d1 is "D1" which identifies the datatype |
| D1. Because C and D1 are in the same package (test), this simple |
| expression is fine.<br> |
| <br> |
| The type expression for d2 is "P.D2". In this case a qualified |
| identifier expression is necessary to identify datatype D2 inside |
| package P.<br> |
| <br> |
| The type expression for s1 is "ecore.EString". This identifies |
| the datatype EString in package ecore (recall that model Ecore.ecore is |
| implicitly imported in all Emfatic programs).<br> |
| <br> |
| The type expression for s2 is "String". The identifier String is |
| actually a special shorthand for ecore.EString, so s1 and s2 have the |
| same type.<br> |
| <h4>3.1 Basic Types</h4> |
| A number of the types defined in Ecore.ecore have shorthand notation in |
| Emfatic. The table below lists the Emfatic shorthand and the |
| corresponding Ecore.ecore type name for each of these basic types as |
| well as the corresponding Java type or class (taken from table 5.1 in |
| the EMF book).<br> |
| <br> |
| <table class="table table-striped table-bordered"> |
| <caption>Table 3.1 - Basic Type Names<br> |
| </caption> |
| <thead> |
| <tr> |
| <th>Emfatic Keyword |
| </th> |
| <th>Ecore EClassifier name |
| </th> |
| <th>Java type name |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>boolean<br> |
| </td> |
| <td>EBoolean<br> |
| </td> |
| <td>boolean<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Boolean<br> |
| </td> |
| <td>EBooleanObject<br> |
| </td> |
| <td>java.lang.Boolean<br> |
| </td> |
| </tr> |
| <tr> |
| <td>byte<br> |
| </td> |
| <td>EByte<br> |
| </td> |
| <td>byte<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Byte<br> |
| </td> |
| <td>EByteObject<br> |
| </td> |
| <td>java.lang.Byte<br> |
| </td> |
| </tr> |
| <tr> |
| <td>char<br> |
| </td> |
| <td>EChar<br> |
| </td> |
| <td>char<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Character<br> |
| </td> |
| <td>ECharacterObject<br> |
| </td> |
| <td>java.lang.Character<br> |
| </td> |
| </tr> |
| <tr> |
| <td>double<br> |
| </td> |
| <td>EDouble<br> |
| </td> |
| <td>double<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Double<br> |
| </td> |
| <td>EDoubleObject<br> |
| </td> |
| <td>java.lang.Double<br> |
| </td> |
| </tr> |
| <tr> |
| <td>float<br> |
| </td> |
| <td>EFloat<br> |
| </td> |
| <td>float<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Float<br> |
| </td> |
| <td>EFloatObject<br> |
| </td> |
| <td>java.lang.Float<br> |
| </td> |
| </tr> |
| <tr> |
| <td>int<br> |
| </td> |
| <td>EInt<br> |
| </td> |
| <td>int<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Integer<br> |
| </td> |
| <td>EIntegerObject<br> |
| </td> |
| <td>java.lang.Integer<br> |
| </td> |
| </tr> |
| <tr> |
| <td>long<br> |
| </td> |
| <td>ELong<br> |
| </td> |
| <td>long<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Long<br> |
| </td> |
| <td>ELongObject<br> |
| </td> |
| <td>java.lang.Long<br> |
| </td> |
| </tr> |
| <tr> |
| <td>short<br> |
| </td> |
| <td>EShort<br> |
| </td> |
| <td>short<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Short<br> |
| </td> |
| <td>EShortObject<br> |
| </td> |
| <td>java.lang.Short<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Date<br> |
| </td> |
| <td>EDate<br> |
| </td> |
| <td>java.util.Date<br> |
| </td> |
| </tr> |
| <tr> |
| <td>String<br> |
| </td> |
| <td>EString<br> |
| </td> |
| <td>java.lang.String<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Object<br> |
| </td> |
| <td>EJavaObject<br> |
| </td> |
| <td>java.lang.Object<br> |
| </td> |
| </tr> |
| <tr> |
| <td>Class<br> |
| </td> |
| <td>EJavaClass<br> |
| </td> |
| <td>java.lang.Class<br> |
| </td> |
| </tr> |
| <tr> |
| <td>EObject<br> |
| </td> |
| <td>EObject</td> |
| <td>org.eclipse.emf.ecore.EObject</td> |
| </tr> |
| <tr> |
| <td>EClass<br> |
| </td> |
| <td>EClass<br> |
| </td> |
| <td>org.eclipse.emf.ecore.EClass</td> |
| </tr> |
| </tbody> |
| </table> |
| <br> |
| Remember that you can always reference these types, and the rest of the |
| types in Ecore.ecore, by using their fully qualified name which begins |
| with the package prefix "ecore". For example <code>ecore.EOperation</code> and <code>ecore.EBigInteger</code> are also |
| legal references to types in Ecore.ecore.<br> |
| <br> |
| <h4>3.2 Multiplicity Expressions </h4> |
| The second part of a type expression is the multiplicity |
| expression. This maps to the <code>lowerBound</code> |
| and <code>upperBound</code> attributes of <code>ETypedElement</code>. Multiplicity |
| expressions are optional, but when omitted the generated <code>ETypedElement</code> gets the defaults (<code>lowerBound</code> = 0 and <code>upperBound</code> = 1). The example |
| below shows some attribute declarations with multiplicity expressions:<br> |
| <br> |
| <pre>class C { |
| attr String[1] s1; |
| attr String[0..3] s2; |
| attr String[*] s3; |
| attr String[+] s4; |
| }</pre> |
| <br> |
| The mapping between various multiplicity expressions and the <code>lowerBound</code> and <code>upperBound</code> attributes of the |
| generated <code>ETypedElement</code> is |
| detailed more fully in the following table.<br> |
| <br> |
| <table class="table table-striped table-bordered"> |
| <caption>Table 3.2 - Multiplicity Expressions<br> |
| </caption> |
| <thead> |
| <tr> |
| <th>Emfatic multiplicity expression |
| </th> |
| <th>ETypedElement lowerBound<br> |
| </th> |
| <th>ETypedElement upperBound<br> |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span |
| >none</span><br> |
| </td> |
| <td>0<br> |
| </td> |
| <td>1<br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[?]</span><br> |
| </td> |
| <td>0<br> |
| </td> |
| <td>1<br> |
| </td> |
| </tr> |
| <tr> |
| <td>[]<br> |
| </td> |
| <td>0<br> |
| </td> |
| <td>unbounded (-1)</td> |
| </tr> |
| <tr> |
| <td><span>[*]</span><br> |
| </td> |
| <td>0<br> |
| </td> |
| <td>unbounded (-1)<br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[+]</span><br> |
| </td> |
| <td>1<br> |
| </td> |
| <td>unbounded (-1)<br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[1]</span><br> |
| </td> |
| <td>1<br> |
| </td> |
| <td>1<br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[<span>n</span>]</span><br> |
| </td> |
| <td><span>n</span><br> |
| </td> |
| <td><span>n</span><br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[0..4]</span><br> |
| </td> |
| <td>0<br> |
| </td> |
| <td>4<br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[<span>m</span>..<span |
| >n</span>]</span><br> |
| </td> |
| <td><span>m</span><br> |
| </td> |
| <td><span>n</span><br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>[5..*]</span><br> |
| </td> |
| <td>5<br> |
| </td> |
| <td>unbounded (-1)</td> |
| </tr> |
| <tr> |
| <td><span>[1..?]</span><br> |
| </td> |
| <td>1<br> |
| </td> |
| <td>unspecified (-2)<br> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br> |
| <br> |
| <h4>3.3 Escaping Keywords</h4> |
| <span>Note: this doesn't really fit here, |
| but I can't find a better place for it...</span><br> |
| <br> |
| Sometimes it's necessary or desirable to use a keyword as the name for |
| some model element. This can be acheived by prefixing the name |
| identifier with the '<code>~</code>' |
| symbol. This ability was added primarily to make it possible to |
| represent Ecore.ecore in Emfatic, so we'll show another example from |
| Ecore.ecore here to illustrate:<br> |
| <br> |
| <pre>class EClass extends EClassifier |
| { |
| // ... |
| ~abstract : EBoolean; |
| ~interface : EBoolean; |
| // ... |
| }</pre> |
| <br> |
| Recall that the <code>abstract</code> |
| and <code>interface</code> keywords |
| are used in class declarations. The code above shows how they can |
| be used as attribute names. Emfatic removes the '<code>~</code>' symbol so names in the |
| generated Ecore model do not contain it.<br> |
| <br> |
| <h3>4. Structural and Behavioral Features</h3> |
| Now we are ready to show how the Ecore class features <code>EAttribute</code>, |
| <code>EReference</code>, <code>EOperation</code> and <code>EParameter</code> are represented in |
| Emfatic. The example below is the class <code>EPackage</code> |
| from Ecore.ecore and it was |
| chosen to give a feel for the feature syntax because it contains a |
| sample of each kind of class feature. <br> |
| <br> |
| <pre>class EPackage extends ENamedElement { |
| op EClassifier getEClassifier(EString name); |
| attr EString nsURI; |
| attr EString nsPrefix; |
| transient !resolve ref EFactory[1]#ePackage eFactoryInstance; |
| val EClassifier[*]#ePackage eClassifiers; |
| val EPackage[*]#eSuperPackage eSubpackages; |
| readonly transient ref EPackage#eSubpackages eSuperPackage; |
| }</pre> |
| <br> |
| For now we just want to point out that the syntax for class features is |
| based on the syntax of Java with one key difference. In Java some |
| elements are introduced with special keywords like <code>class</code> and <code>interface</code>, but type members |
| like fields and methods have no such keywords to introduce them. |
| This works for Java because fields and methods can be distinguished by |
| looking at other syntactic featues (methods have parenthesis and fields |
| do not). However the distinction between what EMF calls |
| attributes and references doesn't really exist in Java, so there is no |
| distinguishing syntax. Because of this and because class features |
| are such an essential element of EMF, a decision was made to use |
| keywords to introduce and differentiate attributes, references and |
| operations. Thus in Emfatic the basic syntax for a class feature |
| looks like this:<br> |
| <br> |
| <div style="margin-left: 40px;"><code>modifiers |
| featureKind typeExpression name ';'</code><br> |
| </div> |
| <br> |
| Where <code>featureKind</code> is one of |
| the four keywords in the following table.<br> |
| <br> |
| <table class="table table-striped table-bordered"> |
| <caption>Table 4.1 - Class Feature Kind Keywords<br> |
| </caption> |
| <thead> |
| <tr> |
| <th>Emfatic |
| keyword<br> |
| </th> |
| <th>introduces<br> |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>attr<br> |
| </td> |
| <td>EAttribute<br> |
| </td> |
| </tr> |
| <tr> |
| <td>op<br> |
| </td> |
| <td>EOperation</td> |
| </tr> |
| <tr> |
| <td>ref<br> |
| </td> |
| <td>normal EReference |
| (EReference.containment = false)<br> |
| </td> |
| </tr> |
| <tr> |
| <td>val<br> |
| </td> |
| <td>"by value" EReference |
| (EReference.containment = true)<br> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br> |
| <h4>4.1 Modifiers</h4> |
| Look again at the Emfatic code above for <code>EPackage</code> and note in the last class |
| feature declaration the keyword <code>ref</code> |
| is preceded by the words <code>readonly</code> |
| and <code>transient</code>. |
| These are modifiers similar in spirit to Java's modifiers such as |
| <code>public</code>, <code>private</code> and <code>abstract</code>. However these |
| modifiers map to |
| boolean attributes on the Ecore classes involved in defining structural |
| and behavioral features. These modifiers must appear directly |
| before the feature's type expression. The table below describes |
| each |
| modifier.<br> |
| <br> |
| <table class="table table-striped table-bordered"> |
| <caption>Table 4.2 - Class Feature Modifiers<br> |
| </caption><thead> |
| <tr> |
| <th>modifier<br> |
| </th> |
| <th>means<br> |
| </th> |
| <th>applies |
| to<br> |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td |
| class="firstcolumn">readonly<br> |
| </td> |
| <td>EStructuralFeature.changeable = |
| false<br> |
| </td> |
| <td>attribute, reference<br> |
| </td> |
| </tr> |
| <tr> |
| <td |
| class="firstcolumn">volatile<br> |
| </td> |
| <td>EStructuralFeature.volatile = |
| true<br> |
| </td> |
| <td>attribute, reference</td> |
| </tr> |
| <tr> |
| <td |
| class="firstcolumn">transient<br> |
| </td> |
| <td>EStructuralFeature.transient = |
| true<br> |
| </td> |
| <td>attribute, reference</td> |
| </tr> |
| <tr> |
| <td |
| class="firstcolumn">unsettable<br> |
| </td> |
| <td>EStructuralFeature.unsettable = |
| true<br> |
| </td> |
| <td>attribute, reference</td> |
| </tr> |
| <tr> |
| <td>derived<br> |
| </td> |
| <td>EStructuralFeature.derived = true<br> |
| </td> |
| <td>attribute, reference</td> |
| </tr> |
| <tr> |
| <td>unique<br> |
| </td> |
| <td>ETypedElement.unique = true<br> |
| </td> |
| <td>attribute, reference, operation, |
| parameter<br> |
| </td> |
| </tr> |
| <tr> |
| <td>ordered<br> |
| </td> |
| <td>ETypedElement.ordered = true<br> |
| </td> |
| <td>attribute, reference, operation, |
| parameter</td> |
| </tr> |
| <tr> |
| <td>resolve<br> |
| </td> |
| <td>EReference.resolveProxies = true<br> |
| </td> |
| <td>reference<br> |
| </td> |
| </tr> |
| <tr> |
| <td>id<br> |
| </td> |
| <td>EAttribute.iD = true<br> |
| </td> |
| <td>attribute<br> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br> |
| Note that the meaning of a modifier may be negated by prefixing the <code>!</code> operator. The example |
| below demonstrates this with an non-ordered attribute:<br> |
| <br> |
| <pre>class X { |
| !ordered attr String[*] s; |
| }</pre> |
| <br> |
| Normally the only modifiers that you should see negated with <code>!</code> are <code>unique</code>, <code>ordered</code> and <code>resolve</code>. This is because |
| these three are true by default, so reversing the Ecore default means |
| using the <code>!</code> |
| operator. Note also that <code>EStructuralFeature.changeable</code> |
| is true by default, but the modifier keyword <code>readonly</code> means the opposite (<code>EStructuralFeature.changeable</code> = |
| false).<br> |
| <br> |
| <h4>4.2 Attributes</h4> |
| We've now seen attribute naming and type expressions. Attributes |
| may also be assigned default value expressions. Below is an |
| example showing the various forms of |
| attribute syntax.<br> |
| <br> |
| <pre>class C { |
| attr String s; |
| attr int i = 1; |
| attr ecore.EBoolean b = true; |
| }</pre> |
| <br> |
| Again note that the declaration of attributes is basically identical to |
| declaring fields in Java except for the presence of the <code>attr</code> keyword.<br> |
| <br> |
| <h4>4.3 References</h4> |
| The type expression syntax for references is slightly complicated by |
| the fact that we need some way to identify the opposite of a |
| reference. Let's return again to the code for <code>EPackage</code>, but we'll just look at the |
| last two feature declarations:<br> |
| <br> |
| <pre>class EPackage extends ENamedElement { |
| // ... |
| val EPackage[*]#eSuperPackage eSubpackages; |
| readonly transient ref EPackage#eSubpackages eSuperPackage; |
| }</pre> |
| <br> |
| Notice that the type expressions are followed by a <code>#</code> symbol and an |
| identifier. This identifier names the <code>EReference</code> which is the <code>opposite</code> of the reference being |
| declared. If a reference doesn't need to specify its opposite |
| then that part (including the <code>#</code> symbol) is omitted.<br> |
| <br> |
| <h4>4.4 Operations</h4> |
| The declaration syntax for operations is Java-like as described above, |
| including use of the keyword <code>void</code> |
| to identify operations which don't return a value. Also a |
| Java-like <code>throws</code> clause |
| allows for the declaration of exception types:<br> |
| <br> |
| <pre>class X { |
| op String getFullName(); |
| op void returnsNothing(); |
| op int add(int a, int b); |
| op EObject doSomething(int a, ecore.EBoolean b) throws ExceptionA, ExceptionB; |
| }</pre> |
| <br> |
| <h3>5. Annotations</h3> |
| Annotations can be attached to every kind of EMF element, however only |
| the <code>source</code> and <code>details</code> features of the resulting <code>EAnnotation</code> can be |
| specified in Emfatic. The Emfatic syntax for representing EMF |
| annotations was inspired by the |
| syntax being introduced for Java annotations in Java 1.5 |
| ("Tiger"). The <code>@</code> |
| symbol is followed by the value of the <code>EAnnotation</code> |
| <code>source</code> |
| attribute. Key/value pairs for the annotation <code>details</code> may appear in parenthesis |
| following the <code>source</code> |
| value. Multiple |
| annotations can be attached to each element. Usually the |
| annotation appears just before its containing element (parameter and |
| enum literal annotations may appear just after the declaration). |
| The example below gives some examples of annotations.<br> |
| <br> |
| <pre>@"http://source/uri"("key1"="value1", "key2"="value2") |
| @sourceLabel(key.a="value1", key.b="value2") |
| @simpleAttr |
| package test; |
| |
| @"http://class/annotation"(k="v") |
| class C { |
| @"http://attribute/annotation"(k="v") |
| attr int a; |
| |
| op int Op(<br> |
| @before(k=v) int a, |
| int b @after(k=v) |
| ); |
| } |
| |
| enum E { |
| @"http://before"(k=v) |
| A=1; |
| B=2 @"http://after"(k=v); |
| }</pre> |
| <br> |
| One subtle point to note is that double quotes are only required around the string value |
| if it is not a valid simple or qualified identifier. So an |
| identifier |
| like <code>key</code> or <code>key.a.b.c</code> need not be quoted, |
| but most complex strings (such as urls) will need to be.<br> |
| <br> |
| <h4>5.1 Annotation Labels<br> |
| </h4> |
| Emfatic allows for short labels to be defined that map to longer URI |
| values for the <code>source</code> |
| attribute of an <code>EAnnotation</code>. |
| The purpose of this feature is to simplify the Emfatic code, making it |
| easier to read and edit. Several annotation labels are available |
| by default, as shown in the following table:<br> |
| <br> |
| <table class="table table-striped table-bordered"> |
| <thead> |
| <tr> |
| <th>Emfatic annotation label<br> |
| </th> |
| <th>maps to EAnnotation.source value<br> |
| </th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td><span>Ecore</span><br> |
| </td> |
| <td><span>http://www.eclipse.org/emf/2002/Ecore</span><br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>GenModel</span><br> |
| </td> |
| <td><span>http://www.eclipse.org/emf/2002/GenModel</span><br> |
| </td> |
| </tr> |
| <tr> |
| <td>ExtendedMetaData<br> |
| </td> |
| <td><span>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</span><br> |
| </td> |
| </tr> |
| <tr> |
| <td><span>EmfaticAnnotationMap</span><br> |
| </td> |
| <td><span>http://www.eclipse.org/emf/2004/EmfaticAnnotationMap</span><br> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <br> |
| The code below shows some examples:<br> |
| <br> |
| <pre>@EmfaticAnnotationMap(myLabel="http://foo/bar") |
| @genmodel(documentation="model documentation") |
| package test; |
| |
| @ecore(constraints="constraintA constraintB") |
| @myLabel(key="value") |
| class C { |
| }</pre> |
| <br> |
| There are several details to elaborate on in the example above. |
| First note that labels are not case sensitive (so <code>Ecore</code> and <code>ecore</code> and <code>ECORE</code> all work the same way).<br> |
| <br> |
| Second, note that declaring an annotation using the label <code>EmfaticAnnotationMap</code> has the |
| side effect of creating a new label which can be used later in the |
| program. So the second annotation on class "C" will get the <code>source</code> value of <code>"http://foo/bar"</code>.<br> |
| <br> |
| Finally, note that the code above shows how to introduce model |
| documentation and constraints in a way that will later flow into |
| generated Java code when working with an EMF genmodel.<br> |
| <br> |
| <h3 id="about">6. About this article</h3> |
| This article was originally written by Chris Daly (cjdaly@us.ibm.com) |
| (Copyright IBM Corp. 2004) and was hosted under IBM alphaWorks. |
| </div> |
| |
| </div> |
| <footer style="padding-top:20px"> |
| <ul class="nav nav-pills"> |
| <li><a href="#">Home</a> |
| <li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a> |
| <li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a> |
| <li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a> |
| <li><a href="http://www.eclipse.org/legal/">Legal</a> |
| <li><a href="http://www.eclipse.org/org/foundation/contact.php">Contact us</a> |
| <li class="active"><a> Copyright © 2012 The Eclipse Foundation. All Rights Reserved.</a> |
| </ul> |
| |
| </footer> |
| |
| </div> <!-- /container --> |
| |
| </body> |
| </html> |