Eclipse Modeling Framewok (EMF) - Distributed Systems
Eclipse Modeling Framewok (EMF) - Distributed Systems
Eclipse Modeling Framewok (EMF) - Distributed Systems
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>)<br />
<strong>Distributed</strong> <strong>Systems</strong><br />
Diego Sevilla Ruiz<br />
DITEC<br />
Facultad de Informática<br />
Murcia, October 2011<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 1 / 52
Contents<br />
1 Introduction<br />
2 Modelado y metamodelado<br />
3 Ecore<br />
Metamodelo<br />
Metamodelos Ecore<br />
<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />
4 Generación del código del modelo<br />
Java: GenModel<br />
C++: <strong>EMF</strong>4CPP<br />
5 Manejo de Modelos y Metamodelos<br />
Java<br />
C++<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 2 / 52
Contents<br />
1 Introduction<br />
2 Modelado y metamodelado<br />
3 Ecore<br />
Metamodelo<br />
Metamodelos Ecore<br />
<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />
4 Generación del código del modelo<br />
Java: GenModel<br />
C++: <strong>EMF</strong>4CPP<br />
5 Manejo de Modelos y Metamodelos<br />
Java<br />
C++<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 3 / 52
<strong>Eclipse</strong> <strong>EMF</strong><br />
The <strong>Eclipse</strong> <strong>Modeling</strong> Framework (<strong>EMF</strong>) is a powerful framework and<br />
code generation facility for building Java applications based on simple<br />
model definitions. Designed to make modeling practical and useful to the<br />
mainstream Java programmer, <strong>EMF</strong> unifies three important technologies:<br />
Java, XML, and UML. Software is focused on manipulating data that can<br />
be modeled, hence, models drive software development. This refcard will<br />
get you started with the <strong>Eclipse</strong> <strong>Modeling</strong> Framework.<br />
Essential <strong>EMF</strong>. Ed Merks & James Sugrue<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 4 / 52
<strong>Eclipse</strong> <strong>EMF</strong> (ii)<br />
Cohesive set of tools to support the model-based development<br />
(MDE) primarily in Java<br />
Defines a framework to easily describe relationships between data<br />
structures and transform the into language programming artifacts<br />
Define una equivalencia entre XSchema, (Meta)Modelo, UML y<br />
código Java anotado<br />
Provides a graphical editor for models<br />
Provides tools to extract information from programs and turn them<br />
into models (T2M), to generate executable code from models (M2T)<br />
and to do model transformations (M2M)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 5 / 52
Contents<br />
1 Introduction<br />
2 Modelado y metamodelado<br />
3 Ecore<br />
Metamodelo<br />
Metamodelos Ecore<br />
<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />
4 Generación del código del modelo<br />
Java: GenModel<br />
C++: <strong>EMF</strong>4CPP<br />
5 Manejo de Modelos y Metamodelos<br />
Java<br />
C++<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 6 / 52
<strong>Modeling</strong> and metamodeling<br />
Un modelo:<br />
It is an abstract representation of a domain<br />
Captures the important elements and their relationships<br />
Los elementos de representación dependen del dominio<br />
Por ejemplo, en UML:<br />
Se representa el problema con clases y relaciones<br />
Se utilizan elementos gráficos para mostrarlos<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 7 / 52
Modelado y metamodelado (ii)<br />
Un metamodelo:<br />
Describe las características de los modelos en sí, y de los elementos<br />
que lo componen<br />
Por ejemplo, cualquier modelo UML contiene:<br />
Clases<br />
Atributos<br />
Operaciones<br />
Relaciones<br />
Herencia<br />
¿Dónde se describe las características de cada elemento estructural<br />
del modelo?<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 8 / 52
Modelado y metamodelado (iii) – MOF<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 9 / 52
Contents<br />
1 Introduction<br />
2 Modelado y metamodelado<br />
3 Ecore<br />
Metamodelo<br />
Metamodelos Ecore<br />
<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />
4 Generación del código del modelo<br />
Java: GenModel<br />
C++: <strong>EMF</strong>4CPP<br />
5 Manejo de Modelos y Metamodelos<br />
Java<br />
C++<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 10 / 52
Ecore<br />
Es equivalente a MOF (EMOF)<br />
Especifica las características de las clases (EClass), sus<br />
características estructurales (EStructuralFeatures), atributos,<br />
operaciones, relaciones (herencia, referencia).<br />
Orientado a Java:<br />
Permite especificar tipos de datos básicos (Java)<br />
No permite el soporte de C++ (directamente). P. ej. no permite<br />
especificar la siferencia entre const o no, punteros, etc.<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 11 / 52
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 12 / 52
Metamodelo: Discusión<br />
Nota: Se describen las características de los elementos del modelo<br />
de datos<br />
El elemento aglutinador (raíz) es el paquete (EPackage)<br />
El paquete contiene físicamente a sus elementos (especificación de<br />
containment)<br />
Los paquetes pueden estar contenidos en otros paquetes<br />
Hay una factoría (EFactory) por paquete que permite la creación de<br />
los elementos del modelo<br />
Las construcciones que describen a un conjunto de elementos<br />
(instancias) son clasificadores (EClassifiers): EClass y EDataType<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 13 / 52
Metamodelo: Discusión (ii)<br />
Las EClasses tienen superclases y están compuestas por<br />
características estructurales (EStructuralFeatures: EReference y<br />
EAttribute).<br />
Tanto las EReferences como los EAttributes pueden estar dotados<br />
de multiplicidad<br />
Los EDataTypes modelan tipos básicos o indivisibles del modelo de<br />
datos<br />
Los EReferences pueden estar contenidos (containment, no tienen<br />
entidad propia) o ser referencias estrictamente (punteros)<br />
Las Operations modelan operaciones del interfaz (aunque no se<br />
provee implementación para ellas)<br />
Todos los elementos heredan de ENamedElement (tienen nombre), y<br />
de EModelElement (elemento del modelo)<br />
Todo elemento del modelo puede tener asociadas anotaciones<br />
(EAnnotation): pares nombre/valor para especificaciones extra (p. ej.<br />
restricciones OCL ó cadenas de documentación)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 14 / 52
<strong>EMF</strong> – Tipos de datos (Datatypes)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 15 / 52
<strong>EMF</strong> – Metamodelos Ecore<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 16 / 52
Metamodelo: Discusión<br />
Nota: Se describen las características de cada clase (es una<br />
instancia del metamodelo de Ecore)<br />
Clasificadores del paquete<br />
Clases<br />
StructuralFeatures de las clases (EAttribtutes, EReferences,<br />
etc.)<br />
La clase Node tiene un atributo y dos referencias<br />
Los atributos sólo pueden ser EDataTypes, y siempre son contenidos<br />
La referencia children es contenida, mientras que parent es un<br />
«puntero»<br />
Nótese también la referencia eOpposite<br />
La raíz así se convierte en un contenedor para todo el modelo<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 17 / 52
<strong>EMF</strong> – Instancia de metamodelo Tree<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 18 / 52
Modelo (instancia): Discusión<br />
Nota: Se describen las instancias de los datos, organizados según el<br />
metamodelo<br />
Varias instancias de las clases<br />
Contienen los campos rellenos, lo que incluye los<br />
StructuralFeatures de las clases (EAttribtutes, EReferences,<br />
etc.)<br />
Los campos referencia opuestos (parent) se rellenan automáticamente<br />
(son relaciones conectadas, todo directo tiene su opuesto)<br />
Gracias al metamodelo, podemos recorrer la estructura siguiendo su<br />
semántica<br />
es decir, obteniendo el «Label» a través del método getLabel() de un<br />
nodo<br />
se puede seguir por los hijos con getChildren()<br />
(se verá después)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 19 / 52
XMI: Serializado XML<br />
1 < tree:Node xmi:version =" 2.0 "<br />
xmlns:xmi =" http: // www . omg . org / XMI "<br />
3 xmlns:tree =" http: // www . example . org / tree "<br />
label =" root "><br />
5 < children label ="A"><br />
< children label ="X"/><br />
7 <br />
< children label ="B"><br />
9 < children label ="Y"/><br />
<br />
11 <br />
Notas:<br />
Sigue la estructura jerárquica de contenido<br />
Las referencias se extraen del metamodelo y de la estructura<br />
Aseguran la integridad referencial gracias al metamodelo<br />
El metamodelo también se serializa a XMI (también es un modelo)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 20 / 52
El editor de Metamodelos – Crear proyecto<br />
New → Other... → Empty <strong>EMF</strong> Project<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 21 / 52
El editor de Metamodelos<br />
Nombre: es.um.emf.test<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 22 / 52
El editor de Metamodelos<br />
El directorio src contiene el código<br />
El directorio model contiene modelos y metamodelos<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 23 / 52
Crear metamodelo Ecore Tree (i)<br />
Dir. model Click derecho → New... → Ecore <strong>Modeling</strong> Framework →<br />
Ecore model<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 24 / 52
Crear metamodelo Ecore Tree (ii)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 25 / 52
Editor gráfico del metamodelo<br />
Tree.ecore Click derecho → Initialize Ecore Diagram file...<br />
(Tree.ecorediag)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 26 / 52
Editor<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 27 / 52
Editor gráfico – Paleta<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 28 / 52
Propiedades del nodo raíz<br />
Ns Prefix – Se utiliza como prefijo de namespace en el XMI<br />
Ns URI – Identifica al metamodelo de forma unívoca universalmente<br />
El metamodelo se puede registrar (y encontrar) en <strong>Eclipse</strong> con ese<br />
nombre único<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 29 / 52
Editor de Ecore no visual<br />
Tree.ecore → Botón derecho → Open With... → Simple Reflective<br />
Ecore Editor<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 30 / 52
Creando instancias dinámicas<br />
El metamodelo describe qué<br />
elementos van a existir en el<br />
modelo<br />
Podemos crear un modelo como<br />
una instancia del metamodelo<br />
Para cada clase del<br />
metamodelo (p. ej. Node)<br />
tendremos un conjunto de<br />
instancias (p. ej. A, B, X, etc.)<br />
iego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 31 / 52
Creando instancias dinámicas (ii)<br />
Node → Botón derecho → New<br />
child...<br />
Se rellenan las propiedades y<br />
las referencias<br />
Las referencias inversas se<br />
rellenan automáticamente<br />
Nótese la referencia al<br />
metamodelo<br />
El fichero es un fichero .xmi<br />
iego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 32 / 52
Contents<br />
1 Introduction<br />
2 Modelado y metamodelado<br />
3 Ecore<br />
Metamodelo<br />
Metamodelos Ecore<br />
<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />
4 Generación del código del modelo<br />
Java: GenModel<br />
C++: <strong>EMF</strong>4CPP<br />
5 Manejo de Modelos y Metamodelos<br />
Java<br />
C++<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 33 / 52
Generación del código del modelo<br />
Intuitivamente, una EClass del metamodelo se transformará en una<br />
clase del lenguaje de programación<br />
Las instancias de esas clases serán el modelo en tiempo de<br />
ejecución de los datos de nuestra aplicación<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 34 / 52
Genmodel<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 35 / 52
Genmodel<br />
Tree.ecore → Botón derecho → New... → <strong>Eclipse</strong> <strong>Modeling</strong> Tools →<br />
Ecore Generator model<br />
Tree.genmodel<br />
Next → Seleccionar<br />
Ecore Model<br />
Nótese las<br />
posibilidades:<br />
Java anotado<br />
XML Schema<br />
Ecore...<br />
Next → Seleccionar el<br />
modelo origen<br />
Tree.ecore → Load<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 36 / 52
Genmodel – Root packages<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 37 / 52
Genmodel en XMI<br />
1 < genPackages prefix =" Tree " disposableProviderFactory ="<br />
true " ecorePackage =" Tree . ecore #/"><br />
< genClasses ecoreClass =" Tree . ecore #// Node "><br />
3 < genFeatures createChild =" false " ecoreFeature ="<br />
ecore:EAttribute Tree . ecore #// Node / label "/><br />
< genFeatures property =" None " notify =" false "<br />
createChild =" false " ecoreFeature ="<br />
ecore:EReference Tree . ecore #// Node / parent "/><br />
5 < genFeatures property =" None " children =" true "<br />
createChild =" true " ecoreFeature ="<br />
ecore:EReference Tree . ecore #// Node / children "<br />
/><br />
...<br />
Guarda los datos y parámetros necesarios para emprender la<br />
generación de código<br />
Nótese las referencias al metamodelo Tree.ecore (URNs)<br />
Conocido como decorador del Ecore (añade características a éste)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 38 / 52
Generate Model Code<br />
Propiedades de Tree: Base Package → es.um.emf.test<br />
Tree.genmodel/Tree, Botón derecho → Generate Model Code<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 39 / 52
Model Code<br />
Paquete es.um.emf.test.tree:<br />
Interfaz puro<br />
Paquete<br />
es.um.emf.test.tree.impl:<br />
Implementación<br />
Paquete<br />
es.um.emf.test.tree.util:<br />
Utilidades<br />
iego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 40 / 52
Model Code – Package<br />
2<br />
package es.um.emf . test . tree ;<br />
public interface TreePackage extends EPackage {<br />
4 String eNAME = " tree ";<br />
String eNS_URI = " urn :es.um.emf . test . tree ";<br />
6 String eNS_PREFIX = "es.um.emf . test . tree ";<br />
8 TreePackage eINSTANCE = tree . impl .<br />
TreePackageImpl . init ();<br />
10 // Singletons ( Ecore metamodel elements )<br />
EClass getNode ();<br />
12 EAttribute getNode_Label ();<br />
EReference getNode_Parent ();<br />
14 EReference getNode_Children ();<br />
16 TreeFactory getTreeFactory ();<br />
} // TreePackage<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 41 / 52
Model Code – Factory<br />
1 package es.um.emf . test . tree ;<br />
3 public interface TreeFactory extends EFactory {<br />
5 // Factory Singleton<br />
TreeFactory eINSTANCE = tree . impl .<br />
TreeFactoryImpl . init ();<br />
7<br />
// Create new nodes ( instances ) of the model<br />
Nodes<br />
9 Node createNode ();<br />
11 TreePackage getTreePackage ();<br />
13 } // TreeFactory<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 42 / 52
Model Code – Node<br />
1 package es.um.emf . test . tree ;<br />
public interface Node extends EObject {<br />
3<br />
// Label get / set<br />
5 String getLabel ();<br />
void setLabel ( String value );<br />
7<br />
// Parent get / set<br />
9 Node getParent ();<br />
void setParent ( Node value );<br />
11<br />
// Children<br />
13 EList getChildren ();<br />
15 } // Node<br />
EList permite también añadir elementos a través de su<br />
método add(): node.getChildren().add(x)<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 43 / 52
C++<br />
Con el plugin org.csu.emf4cpp.plugin instalado:<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 44 / 52
C++<br />
Si no se elige wizard el código se<br />
genera en el subdirectorio src-gen<br />
Similar a la estructura en Java<br />
Se generan utilidades de compilación<br />
con CMake (CMakeLists.txt,<br />
tree.cmake)<br />
Paquete tree dentro del subdirectorio<br />
tree<br />
.hpp y .cpp<br />
tree.hpp – Incluir el modelo en<br />
programas C++<br />
tree/Node.{hpp,cpp} – Clase Node<br />
También Paquete y Factoría<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 45 / 52
C++ Model Code – Package<br />
1 namespace tree<br />
{<br />
3 class TreePackage : public virtual :: ecore :: EPackage<br />
{<br />
5 public :<br />
static TreePackage_ptr _instance ();<br />
7<br />
// EClassifiers methods<br />
9 virtual :: ecore :: EClass_ptr getNode ();<br />
11 // EStructuralFeatures methods<br />
virtual :: ecore :: EAttribute_ptr getNode__label ();<br />
13 virtual :: ecore :: EReference_ptr getNode__parent ();<br />
virtual :: ecore :: EReference_ptr getNode__children ();<br />
15<br />
protected :<br />
17 static std :: auto_ptr < TreePackage > s_instance ;<br />
19 TreePackage ();<br />
21 // EClass instances<br />
:: ecore :: EClass_ptr m_NodeEClass ;<br />
23<br />
// EStructuralFeatures instances<br />
25 :: ecore :: EAttribute_ptr m_Node__label ;<br />
:: ecore :: EReference_ptr m_Node__parent ;<br />
27 :: ecore :: EReference_ptr m_Node__children ;<br />
};<br />
29 } // tree<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 46 / 52
C++ Model Code – Factory<br />
1 namespace tree<br />
{<br />
3 class TreeFactory : public virtual :: ecore ::<br />
EFactory<br />
{<br />
5 public :<br />
static TreeFactory_ptr _instance ();<br />
7<br />
9<br />
virtual Node_ptr createNode ();<br />
protected :<br />
11 static std :: auto_ptr < TreeFactory > s_instance<br />
;<br />
13 TreeFactory ();<br />
};<br />
15 } // tree<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 47 / 52
C++ Model Code – Node<br />
1 namespace tree<br />
{<br />
3 class Node : public virtual :: ecore :: EObject<br />
{<br />
5 public :<br />
Node ();<br />
7 virtual ~ Node ();<br />
9 virtual void _initialize ();<br />
11 // Attributes<br />
:: ecore :: EString const & getLabel () const ;<br />
13 void setLabel (:: ecore :: EString const & _label );<br />
15 // References<br />
:: tree :: Node_ptr getParent ();<br />
17 void setParent (:: tree :: Node_ptr _parent );<br />
19 :: ecorecpp :: mapping :: EList < :: tree :: Node >& getChildren ();<br />
protected :<br />
21 // Attributes<br />
:: ecore :: EString m_label ;<br />
23 // References<br />
:: tree :: Node_ptr m_parent ;<br />
25 :: ecorecpp :: mapping :: out_ptr < :: ecorecpp :: mapping :: EList < :: tree :: Node ><br />
><br />
m_children ;<br />
27 };<br />
} // tree<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 48 / 52
Contents<br />
1 Introduction<br />
2 Modelado y metamodelado<br />
3 Ecore<br />
Metamodelo<br />
Metamodelos Ecore<br />
<strong>EMF</strong> y Ecore en <strong>Eclipse</strong><br />
4 Generación del código del modelo<br />
Java: GenModel<br />
C++: <strong>EMF</strong>4CPP<br />
5 Manejo de Modelos y Metamodelos<br />
Java<br />
C++<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 49 / 52
Crear un modelo programáticamente – Java<br />
TreeFactory tree = TreeFactory . eINSTANCE ;<br />
2 Node root = tree . createNode ();<br />
root . setLabel (" Root ");<br />
4 Node a = tree . createNode ();<br />
a. setLabel ("A");<br />
6 root . getChildren ().add (a);<br />
Node x = tree . createNode ();<br />
8 x. setLabel ("X");<br />
a. getChildren ().add (x);<br />
10 Node b = tree . createNode ();<br />
b. setLabel ("B");<br />
12 root . getChildren ().add (b);<br />
Node y = tree . createNode ();<br />
14 y. setLabel ("Y");<br />
b. getChildren ().add (y);<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 50 / 52
C++<br />
1 using namespace tree ;<br />
3 TreeFactory_ptr treeFactory = TreeFactory :: _instance ();<br />
5 // Create a Node<br />
std :: auto_ptr root ( treeFactory -> createNode ());<br />
7 root -> setLabel (" Root ");<br />
9 // Create node A<br />
Node_ptr a = treeFactory -> createNode ();<br />
11 catSAES -> setLabel ("A");<br />
root -> getChildren (). push_back (a);<br />
13<br />
Node_ptr x = treeFactory -> createNode ();<br />
15 catSAES -> setLabel ("X");<br />
a-> getChildren (). push_back (x);<br />
17<br />
// Create node B<br />
19 Node_ptr b = treeFactory -> createNode ();<br />
catSAES -> setLabel ("B");<br />
21 root -> getChildren (). push_back (b);<br />
23 Node_ptr y = treeFactory -> createNode ();<br />
catSAES -> setLabel ("Y");<br />
25 b-> getChildren (). push_back (y);<br />
27 // Initialize the model<br />
umu -> _initialize ();<br />
29<br />
// ( model is deleted automatically )<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 51 / 52
Referencias<br />
D. Steinberg, F. Budinsky, M. Paternostro, Ed Merks<br />
<strong>EMF</strong>: <strong>Eclipse</strong> <strong>Modeling</strong> Framework, 2nd Edition.<br />
Addison-Wesley Professional, 2009<br />
Ed Merks, J. Sugrue<br />
Essential <strong>EMF</strong> (<strong>Eclipse</strong>Con’09).<br />
http://cheat-sheets.biz/saved-copy/rc039-010d-emf.pdf<br />
M. Paternostro, K. Hussey<br />
Building RESTful Java Applications with <strong>EMF</strong>.<br />
http://www.slideshare.net/kenn.hussey/<br />
building-restful-java-applications-with-emf<br />
A. Senac, D. Sevilla<br />
<strong>EMF</strong>4CPP.<br />
http://www.catedrasaes.org/trac/wiki/<strong>EMF</strong>4CPP<br />
Diego Sevilla Ruiz (DITEC Facultad de Informática) <strong>Eclipse</strong> <strong>Modeling</strong> <strong>Framewok</strong> (<strong>EMF</strong>) Murcia, October 2011 52 / 52